2

エラーが表示されます:

varchar 値 'INSERT INTO TableRowCount (IntFieldID, DecimalField) SELECT' をデータ型 int に変換するときに変換に失敗しました"

次のコードを使用します。

DECLARE @start INT -- @start is an INT
SET @start = 1 -- INT

DECLARE @sql NVARCHAR(MAX)
SET @sql = 'INSERT INTO TableRowCount (IntFieldID, DecimalField)
SELECT ' + @start +', COUNT(*)
FROM dbo.somewhere' -- location is irrelevant

EXECUTE(@sql) -- this is where it fails

と を削除するIntFieldID@start、挿入で機能します (ただし、目的に反します)。を含めようとしましたが、これはすでに ( をとしてキャストする)SELECT CAST(' + @start + ' AS INT)ため、少し冗長に思えますが、どちらも機能しません。また、 DYNAMIC-SQLから始めてみましたが、うまくいきませんでした。すべての周りで 3 つを使用してみました (うまくいきませんでした)。オンラインで読んだいくつかの場所では、変数を文字列に入れることを提案する応答がありました。エラー:@startINTINTINTN' '''

スカラー変数 @start を宣言する必要があります

(それは正しく聞こえなかったので、当然のことです)。

4

2 に答える 2

5

整数を連結しようとするよりも良い方法は、厳密に型指定されたパラメーターとして渡すことです。

DECLARE @start INT = 1;

DECLARE @sql NVARCHAR(MAX) = N'INSERT ...
  SELECT @start, COUNT(*) FROM ' + @conn;

EXEC sp_executesql @sql, N'@start INT', @start;
于 2013-03-28T14:43:52.767 に答える
4

@Startに変換する必要がありますvarchar

DECLARE @sql NVARCHAR(MAX)
SET @sql = 'INSERT INTO TableRowCount (IntFieldID, DecimalField)
SELECT ' + CAST(@start as nvarchar(20)) +', COUNT(*)
FROM ' + @conn

SQL Server は、いくつかのかなり複雑な基準に基づいて、連結または加算時に暗黙的にデータ型を変換します。an と文字列を結合しようとすると、明示的に指定しない限りint、常に文字列を an に変換しようとすると言えば十分です。int

以下は、 MSDN からの参照用の変換チャートです。

ここに画像の説明を入力

于 2013-03-28T14:40:55.853 に答える