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

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

あなたは@ S1を印刷するときに結果を共有できますか? – HLGEM

+0

私はprint @ S1 Resultで更新しました。 – Mitul

答えて

1

これらの値はあなたには既知であり、どこかのUIでは提供されないため、手動でエスケープすることができます。あなたは、非使用していないのはなぜ

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

の 'So2234'

RESULT 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

:「実行中」の値が一定ではなく、

はこれを試してみてくださいUI(SQLインジェクション)によって提供されている場合 しかし、これをしません動的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

ああ!だから私はこのようにNullの値を心配する必要はありません。これは私が正しいと思います。これは素晴らしいだろう。 – Mitul

関連する問題