3

SQLを実行しようとすると、テキストであるため、@Statusパラメーターの値が一重引用符でフォーマットされません。したがって、 Runningは無効な列名であるため、このエラーが発生します。

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
無効な列名'So2234'

印刷結果@S1

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

3 に答える 3

1

からの結果を確認してくださいSELECT @S1

構文エラーがあるはずです!たとえば、通常、どこかにスペースや引用符がないことが主な理由です。


アップデート:

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

ランニングとSo2234プロリーはテキストデータ型であるため、引用符がありません。

于 2012-05-08T14:29:41.650 に答える
1

これらの値はユーザーが知っていて、UIによって提供されていないため、手動でエスケープできます。ただし、「実行中」の値が一定ではなく、UI(SQLインジェクション)によって提供される場合は、これを行わないでください。

これを試して:

IF @Status IS NOT NULL 
    BEGIN
    SET @S1 = ( N',  dbo.JobQueue.Status = ''' + @Status + ''');
...
于 2012-05-08T14:31:52.340 に答える
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
于 2012-05-08T14:37:59.620 に答える