带有动态SQL的sql server中的列名无效

时间:2012-05-08 14:24:37

标签: sql-server-2008

当我尝试运行SQL时,它没有用单引号格式化@Status参数'值,因为它是文本。因此,它会出现此错误,因为正在运行是无效的列名。

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)

Msg 207,Level 16,State 1,Line 1
列名称“正在运行”无效。
消息207,级别16,状态1,行1 列名称“So2234”无效

打印结果@ S1

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

3 个答案:

答案 0 :(得分:1)

检查SELECT @S1的结果。

必须有语法错误!例如,某些地方缺少空格或引号通常是主要原因。


更新

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

运行和So2234很多都是文本数据类型,所以你在它们上缺少引号!

答案 1 :(得分:1)

由于这些值是您所知道的,而不是由某个UI提供的,因此您可以手动转义它们。 但是,如果“正在运行”值不是常量但由UI(SQL注入)

提供,请不要这样做

试试这个:

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

答案 2 :(得分: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