2013-03-28 41 views
0

我收到一個錯誤:動態SQL未進行轉換VARCHAR到INT(不應該反正)

Conversion failed when converting the varchar value 'INSERT INTO TableRowCount (IntFieldID, DecimalField) SELECT 'to data type 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),這似乎是因爲@start有點多餘是INT已經(鑄造INT作爲INT),但這並不工作。我也試圖與一個N'動態SQL,沒有工作開始,我嘗試用三個'''周圍的一切(didnt的工作),並在這我在網上看了幾個地方,反應建議把該變量的字符串,這產生了錯誤:

Must declare scalar variable @start

(沒有意外,因爲這聽起來不正確)。

回答

2

你需要轉換你的@Startvarchar

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

根據一些相當複雜的標準,SQL Server在連接或添加時隱式轉換數據類型。只要你試圖合併一個int和一個字符串,它總是會試圖將字符串轉換爲int,除非你明確地告訴它。

下面是供您參考換算表from MSDN.

enter image description here

+0

廠,但是這個邏輯逃避了我。我必須將它轉換爲'NVARCHAR'才能讀取,即使它應該是'INT'?對不起,剛看到更新。 – Question3CPO

+0

您將它轉換爲字符串,因爲您將它連接到要執行的SQL字符串中。 – JNK

+0

原因是你試圖使它成爲nvarchar變量的一部分。如果你將一個字符串聯合到一個int中,SQl服務器將試圖轉換爲int數據類型,當然這些字符串數據通常不能轉換。 – HLGEM

4

不是試圖串聯的整數,以將它作爲一個強類型的參數,一個更好的辦法:

DECLARE @start INT = 1; 

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

EXEC sp_executesql @sql, N'@start INT', @start; 
+0

只有你關心SQL注入;)+1 – JNK

+0

@JNK或者如果你開始添加更多的變量,不同的數據類型等等。字符串連接是醜陋的。 –