1

次のSQLサーバーで立ち往生しています:

DECLARE @sql AS NVARCHAR(500),@db as varchar(50),@value AS CHAR(129);
SET @db = 'SSCT1';
SET @value = '1806-11-801-1000';
SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) 
  + '.[dbo].[GL00105] WHERE ACTNUMST = ' + @value;
EXEC (@sql);

これをSQLサーバーで実行すると、次のようになります:varchar値を変換するときに変換に失敗しました '1806-11-801-1000

where句を使用しているフィールドを確認しましたが、宣言のタイプ(char(129))と一致するため、何を変換しようとしているのかわかりません。

値に加えて変数としてデータベース名を受け入れる SQL ステートメントを作成しようとしています。何かご意見は?

ありがとう

4

3 に答える 3

3

これは文字列列であると推測しACTNUMSTます。その場合、正しく区切る必要があります。

SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) 
  + '.[dbo].[GL00105] WHERE ACTNUMST = ''' 
  + @value + ''';';

アポストロフィが含まれている可能性がある場合@valueは、さらに対処する必要があります。

SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) 
  + '.[dbo].[GL00105] WHERE ACTNUMST = ''' 
  + REPLACE(@value, '''', '''''') + ''';';

うん。より安全なアプローチは次のとおりです。

DECLARE 
  @sql   NVARCHAR(MAX),
  @db    SYSNAME,
  @value CHAR(129);

SELECT
  @db = N'SSCT1',
  @value = '1806-11-801-1000';

SET @sql = N'SELECT ACTINDX FROM ' + quotename(@db) 
  + '.[dbo].[GL00105] WHERE ACTNUMST = @val;';

EXEC sp_executesql @sql, N'@val CHAR(129)', @value;

これにより、動的 SQL に対する保護が少し強化され、引用符を処理する必要がなくなります。

于 2012-08-10T19:29:55.293 に答える
0

これは、char 値を引用しなかったために発生する可能性があります。これを試して

SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) + '.[dbo].[GL00105] WHERE ACTNUMST = ''' + @value + '''';
于 2012-08-10T19:30:53.720 に答える
0

SQL を実行しようとすると失敗しますか? または、EXEC 呼び出しをコメントアウトしても失敗しますか?

私の目を引くことの 1 つは、@value を一重引用符で囲んでいないことです。したがって、@sql が構築されると、最終的には ... として構築されます。

WHERE ACTNUMST = 1806-11-801-1000

しかし、それはこのように見えるはずです...

WHERE ACTNUMST = '1806-11-801-1000'

これが実際に問題である場合は、SET @sql を次のように変更する必要があります...

SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) + '.[dbo].[GL00105] WHERE ACTNUMST = ''' + @value + '''';

これにより、単一引用符が動的 SQL ステートメントに追加されます。これが役立つことを願っています。

于 2012-08-10T19:38:00.120 に答える