2012-05-08 107 views
3

當我嘗試運行SQL時,由於它是文本,因此它沒有使用單引號格式化@Status參數的值。因此它給出這個錯誤爲運行是無效的列名稱。帶有動態SQL的sql server中的列名無效

DECLARE 
    @ID int, 
    @Status varchar(150), 
    @StandardOutput varchar(max) = NULL, 
    @StandardError varchar(max) = NULL, 
    @Query Varchar(max), 
    @S1 varchar(max), 
    @S2 varchar(max), 
    @S3 varchar(max) 


SET  @Status = N'Running' 
SET  @StandardError = N'So2234' 
SET  @StandardOutput = Null 
SET @S1 = '' 
SET @ID = 1 
--DECLARE @S1 varchar(max) 
--SET @S1 = N' ' 
IF @Status IS NOT NULL 
    BEGIN 
    SET @S1 = (N', dbo.JobQueue.Status = ' + @Status); 
    END 
IF @StandardError IS NOT NULL 
    BEGIN 
    SET @S1 = @S1 + N', dbo.JobQueue.StandardError = ' + @StandardError 
    END 
IF @StandardOutput IS NOT NULL 
    BEGIN 
    SET @S1 = N', dbo.JobQueue.StandardOutput = ' + @StandardOutput 
    END 

SET @S1 = (N' UPDATE dbo.JobQueue SET ' + SUBSTRING(@S1, 2, LEN(@s1))) + ' '; 
SET @S1 = @S1 + N' WHERE dbo.JobQueue.ID = ' + CONVERT(VARCHAR(12), @ID); 
SELECT @S1 
EXEC(@S1) 

消息207,級別16,狀態1,行1
無效列名 '正在運行'。
消息207,級別16,狀態1,行1
無效的列名PRINT @ S1的 'So2234'

結果

UPDATE dbo.JobQueue SET dbo.JobQueue.Status = Running, dbo.JobQueue.StandardError = So2234 WHERE dbo.JobQueue.ID = 1 
+0

當您打印@ S1時,您能分享結果嗎? – HLGEM

+0

我已經更新了print @ S1結果。 – Mitul

回答

1

由於這些值由您知道,而不是由用戶界面提供,您可以手動將其轉義。 不過,不這樣做,如果「跑」價值不是恆定的,而是由一個UI(SQL注入)提供

試試這個:

IF @Status IS NOT NULL 
    BEGIN 
    SET @S1 = (N', dbo.JobQueue.Status = ''' + @Status + '''); 
... 
1

SELECT @S1檢查結果。

它必須有一個語法錯誤!例如,空間或引號缺失通常是主要原因。


更新:

UPDATE dbo.JobQueue SET dbo.JobQueue.Status = Running, dbo.JobQueue.StandardError = So2234 WHERE dbo.JobQueue.ID = 1 

運行和So2234 prolly是文本數據類型,所以你錯過了他們的報價!

+0

是的,它是缺少引號,但設置@ s1時,它是用引號指定的,當它被生成爲SQL時,它將刪除它們。 – Mitul

+0

'SET @Status = N'「Running」'' 'SET @StandardError = N'「So2234」''' 嘗試更改爲此 –

0

你爲什麼不使用非動態sql在這裏?

UPDATE jq 
SET Status = ISNULL(@status, jq.Status) 
    ,StandardError = ISNULL(@StandardError, jq.StandardError) 
    ,StandardOutput = ISNULL(@StandardOutput, jq.StandardOutput)  
FROM dbo.JobQueue jq 
WHERE jq.ID = @id 
+0

哦!所以我不必擔心這種方式的空值。這應該小心,我猜對了。這將是驚人的。 – Mitul