2011-12-09 14 views
1

動的SQLの更新文を作成しています。このステートメントは、未知数の列を更新します。私は賢明な方法を探して、正しい列の間にコンマをセットするようにしてください。動的更新SQL

このupdateSQLにはさらに多くの建物がありますが、これは私の質問にとって唯一の関連する部分です。

重要な注意点の1つは、whileループの最後の実行が必ずしも更新で新しい列を入れるわけではないので、私はそれをチェックとして使用できないということです。

アイデア?

最後の文字を取り除く、あなたのループ後のSQL Server 2008

答えて

0

を使用していますか?

SET @UpdateSQL = LEFT(@UpdateSQL, LEN(@UpdateSQL) - 1) 


変更 '' を付加コードのFRONTの位置が、最初の1のためにそれを設定していない...

DECLARE @UpdateSQL nvarchar(max) = 'UPDATE MYTABLE SET ', @comma NVARCHAR(2) = ' ' 
WHILE (somecondition) 
BEGIN 
    IF (someothercondition) 
    BEGIN 
     SET @UpdateSQL = @UpdateSQL + @comma + @ColNameVar + ' = ' @ColNameVar 
     SET @comma  = ', ' 
    END 
END 
+0

ありがとうございます!あなたはすべて正しいです。だから誰が正しいとマークするかを選ぶのは難しい...:S – user829237

0

することができますwhile後に最後の文字,を削除します。

DECLARE @UpdateSQL nvarchar(max) = 'UPDATE MYTABLE SET ' 
WHILE (somecondition) 
BEGIN 
    IF (someothercondition) 
     SET @UpdateSQL = @UpdateSQL + @ColNameVar + ' = ' @ColNameVar + ',' 
       --How to set this comma only on columns that are not the last?? 
END 
SET @UpdateSQL = LEFT(@UpdateSQL , LEN(@UpdateSQL)-1) 
+0

ありがとう!あなたはすべて正しいです。だから、正しいとマークする人を選ぶのは難しいです...:S – user829237

0

文字列migカンマでHT ない終わり、これを試してみてください。常に

if right(@UpdateSQL, 1) = ',' 
begin 
    set @UpdateSQL = left(@UpdateSQL, len(@UpdateSQL) - 1) 
end 
+0

OPはそれ自身でUPDATE MYTABLE SETを実行しないようにOPがすでにテストしていると信じています。 – MatBailie

+0

ありがとう!あなたはすべて正しいです。だから、正しいとマークする人を選ぶのは難しいです...: – user829237

0

There'a、動的SQLよりも、物事を行うには、ほとんどのより良い方法...テーブルは更新が動的である場合でも、列の有限数を持っています。この場合は、条件付きのSET句で、完全なUPDATE文を書く:

UPDATE MYTABLE 
SET Col1 = CASE WHEN ISNULL(@Col1, '') = '' THEN Col1 ELSE @Col1 END, 
Col2 = CASE WHEN ISNULL(@Col2, '') = '' THEN Col1 ELSE @Col2 END, 
Col3 = CASE WHEN ISNULL(@Col3, '') = '' THEN Col1 ELSE @Col3 END, 
Col4 = CASE WHEN ISNULL(@Col4, '') = '' THEN Col1 ELSE @Col4 END 
WHERE Blah = 'blah' 

あなたの文の正確な句は異なる場合があります - あなたはISNULL()またはCOALESCEとCASE文を置き換えることができるかもしれ()管理しやすくします。

これは、クエリがキャッシュされることを意味します。実行は高速ですが(無視されますが)、最も重要なことは、コードの読み込みとデバッグがはるかに簡単になることです。

+0

動的SQLよりもこのメソッドの利点は、言及しなかったことは、動的SQLはSQLインジェクション – BornToCode

関連する問題