8

前もってデータ型の情報がないテーブルに対して T-SQL SELECT ステートメントを生成しています。これらのステートメントでは、テーブルの列の元の値の長さに応じて文字列操作操作を実行する必要があります。

1 つの例 (ただし、唯一の例ではありません) は、文字列の特定の位置にテキストを挿入することです。これには、末尾に挿入するオプションが含まれます。

SELECT 
  CASE WHEN (LEN ([t0].[Product] = 8) 
    THEN [t0].[Product] + 'test' 
    ELSE STUFF ([t0].[Product], 8, 0, 'test') 
  END
FROM [OrderItem] [t0]

(STUFF では文字列の末尾にテキストを挿入できないため、CASE WHEN + LEN が必要です。)

問題は、LEN が末尾の空白を除外するため、計算が台無しになることです。末尾の空白を除外しない DATALENGTH を使用できることはわかっていますが、Product 列の型が varchar 型か nvarchar 型かがわからないため、DATALENGTH によって返されるバイトを STUFF で必要な文字に変換することはできません。

では、使用されている文字列データ型に関する事前情報なしで、文字列の正確な文字数に依存する SQL ステートメントを生成するにはどうすればよいでしょうか?

4

5 に答える 5

14

これが私が最終的に使用したものです:

SELECT   
  CASE WHEN ((LEN ([t0].[Product] + '#') - 1) = 8)   
    THEN [t0].[Product] + 'test'   
    ELSE STUFF ([t0].[Product], 8, 0, 'test')   
  END  
FROM [OrderItem] [t0]  

測定結果によると、LEN (... + '#') - 1 トリックは、LEN (...) だけの場合とほぼ同じ速度です。

すべての良い答えをありがとう!

于 2010-09-23T13:51:03.220 に答える
5

これを試して:

SELECT 
  CASE WHEN (LEN (REPLACE([t0].[Product],' ', '#') = 8) 
    THEN [t0].[Product] + 'test' 
    ELSE STUFF ([t0].[Product], 8, 0, 'test') 
  END
FROM [OrderItem] [t0]
于 2010-09-20T10:34:12.107 に答える
3

システム テーブルの列の型情報を調べることはできませんか?

varcharそうでない場合は、列がそうであるかどうかを判断するか、これで十分nvarcharです。

create table #test
(
c varchar(50),
n nvarchar(50)
)

insert into #test values ('1,2,3,4    ',N'1,2,3,4,5      ')

SELECT
       CASE
              WHEN datalength(CAST(c AS nvarchar(MAX))) = datalength(c)
              THEN 'c is nvarchar'
              ELSE 'c is char'
       END,
       CASE
              WHEN datalength(CAST(n AS nvarchar(MAX))) = datalength(n)
              THEN 'n is nvarchar'
              ELSE 'n is char'
       END
FROM   #test
于 2010-09-20T10:31:55.777 に答える
1

とを使用DATALENGTHSQL_VARIANT_PROPERTYます。

SELECT 
  CASE 
    WHEN 8
      = DATALENGTH([t0].[Product]) 
      / CASE SQL_VARIANT_PROPERTY([t0].[Product],'BaseType') WHEN 'nvarchar' THEN 2 ELSE 1 END
    THEN [t0].[Product] + 'test' 
    ELSE STUFF ([t0].[Product], 8, 0, 'test') 
  END
FROM [OrderItem] [t0]
于 2010-09-20T14:34:25.743 に答える
0

先頭の空白がない場合はlen(reverse(column_name))、列の長さが得られます。

于 2012-06-21T00:10:44.507 に答える