2012-05-08 106 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