2015-07-03 216 views
0

我搜索有關錯誤,但我只找到不適合我的不同答案。SQL查詢錯誤:轉換varchar值時轉換失敗

我有這個疑問,在SQL Server:

DECLARE @column_name varchar (25), 
@data_column int, 
@table_name varchar (25) 

DECLARE @mySql nvarchar (MAX) 

SET NOCOUNT ON; 

SET @column_name = 'Excellent' 
SET @table_name = 'CSAT' 
SET @data_column = 10 

SET @mySql = 'INSERT INTO '[email protected]_name+'('[email protected]_name+') VALUES('[email protected]_column+')' 
EXEC (@mySql) 

當我執行它,它表明我這個錯誤:

Conversion failed when converting the varchar value 'INSERT INTO CSAT(Excellent) VALUES(' to data type int.

的所有列都是INT和允許空值。

我必須做一個轉換或什麼?我感謝您的幫助!

回答

4

@data_column是一個int,所以你需要將它轉換爲varchar,因爲你正在構建一個字符串。

SET @mySql = 'INSERT INTO '[email protected]_name+'('[email protected]_name+') 
       VALUES('+ Convert(Varchar(10), @data_column)+')' 

當SQL Server遇到混合字符串和INT的表達,它試圖將字符串轉換爲int(而不是周圍的其他方法)。這是記錄在這裏:SQL Server Data Type Precedence

+0

謝謝!!我今天學到了重要的東西! :) – EyMarie

+0

此代碼易受sql注入攻擊。 –

+0

如果您針對數據庫中的表和列檢查column_name和table_name,則不存在漏洞。 –

0

的SQL是試圖讓你的串線的總和:

SET @mySql = 'INSERT INTO '[email protected]_name+'('[email protected]_name+') VALUES('[email protected]_column+')' 

變化從int的@data_column參數以varchar或使用CONCAT函數創建您的SQL命令:

SET @mySql = CONCAT('INSERT INTO ',@table_name,' (',@column_name,') VALUES(',@data_column,')') 
0

Y OU應該使用Parametrised查詢要做到這一點,還可以使用適當的數據類型爲對象名稱...

是這樣的....

SET NOCOUNT ON; 

DECLARE @column_name SYSNAME 
     ,@data_column INT 
     ,@table_name SYSNAME 
     ,@mySql  NVARCHAR(MAX); 

SET @column_name = 'Excellent' 
SET @table_name = 'CSAT' 
SET @data_column = 10 

SET @mySql = N' INSERT INTO '+ QUOTENAME(@table_name) 
      + N' ('+ QUOTENAME(@column_name) +') ' 
      + N' VALUES(@data_column)' 


Exec sp_executesql @mySql 
        ,N'@data_column INT' 
        ,@data_column 
相關問題