0

次のストアドプロシージャがあります。

CREATE PROCEDURE [cafgAddCoreID]
@HoldingName nvarchar (50) = null
@CountStart int = 0,
AS
DECLARE @sql nvarchar (50)
DECLARE @bit nvarchar (200)
BEGIN
    SET @bit = 'MTR1- + CAST ((' + @CountStart + ' + ROW_NUMBER() 
      OVER (ORDER BY [FindNo])) AS NVARCHAR(10))'
    SET @sql = 'INSERT INTO ' + @HoldingName + '([CoreID]) 
      SELECT (' + @bit + ') FROM [DectectoristMetalFinds]'
    EXEC @sql
END    

しかし、私が実行すると:

EXEC [cafgAddCoreID] 'Table1', 9

私は得る

varchar値'MTR1-+ CAST(('をデータ型intに変換するときに変換に失敗しました。

ランニング

INSERT INTO [Table1] ([CoreID])   
SELECT ('MTR1-' + CAST ((0 + ROW_NUMBER() OVER (ORDER BY FindNo)) 
  AS NVARCHAR(10))) AS CoreID FROM [Table2]

動作するので、メソッドが正しいことはわかっていますが、ストアドプロシージャでは明らかにそうではありません。

4

1 に答える 1

3

文字列に整数を「追加」することはできません。データ型の優先順位は、周囲のリテラルをintに変換しようとします。代わりに、intを文字列に明示的に変更する必要があります。

SET @bit = '''MTR1-'' + CAST ((' + CONVERT(VARCHAR(12), @CountStart) + '...

それでも正しく解析されるようには見えませんが、次のコマンドを発行してさらに調査できるようになるはずです。

PRINT @sql;

それ以外の:

EXEC @sql;

また、次のいずれかを使用する必要があります。

EXEC(@sql);

またはさらに良い:

EXEC sp_executesql @sql;

(@CountStartをパラメーター化し、SQLインジェクション用の1つのベクトルを回避するために使用できます。そのバージョンを作成しますが、最初に作成しようとしている有効なSQLを質問から判断することはできません。)

また、に50文字以上を与えることを検討することもでき@sqlます。ちょっとした考え。

于 2013-03-25T17:08:01.900 に答える