2009-04-15 11 views
1

私はSQLプログラミングでより効率的になりたいと考えています。 数値サフィックスだけで変更されるフィールド名に対して、更新コマンドを繰り返すためにループを実行しようとしています。たとえば、代わりにx_1, y_1を書き出すのWhileループを使用したSQL Serverの更新

、その後、更新ごとにx_2, y_2

DECLARE @a INT 
DECLARE @b VARCHAR 

SET @a = 1 
WHILE @a < 30 
set @b = @a 
    BEGIN 
     UPDATE source set h = h + "x_"[email protected] 
      where "y_"[email protected] = 'Sold' 
    SET @a = @a + 1 
    END 

は私が明確にできるかどうか私に教えてください。私はSQL Server 2005を使用しています。

ありがとうございました。


私はアダムスのソリューションを適用し、以下ではNの適切な使用」であるかを理解する必要がしようとしている:

exec sp_executesql update source_temp set pmt_90_day = pmt_90_day + convert(money,'trans_total_'[email protected]'') 
    where convert(datetime,'effective_date_'[email protected]) <= dateadd(day,90,ORSA_CHARGE_OFF_DATE) 
    and DRC_FLAG_'[email protected] = 'C' 

答えて

6

あなたが持つことができないので、これは実際には、動作しません。列名は引用符で囲みます。あなたが基本的にしていることは、SQLが常に異なる2つの文字列を比較することです。つまり、決して更新を実行しません。あなたは、このようにそれを行う必要がある場合は、あなたのようなものを持っている必要があるだろう

...一般的には

DECLARE @a INT 
DECLARE @b VARCHAR 
SET @a = 1 

WHILE @a < 30 
BEGIN 
set @b = @a 
exec sp_executesql N'UPDATE source set h = h + 'x_'[email protected] + N' 
      where y_'[email protected] + N' = ''Sold''' 

SET @a = @a + 1 
END 

は、しかし、私はこのような行為を阻止したいです。私は、動的なSQLのファンは、生産コードの任意の並べ替えのための別のSQLステートメント内で生成されていません。一回限りの開発作業を行う上で非常に便利ですが、ユーザーが実行できるコードではそれが嫌です。

+0

アダム、あなたが私のリビジョンに関して助けてくれたら、私はそれを感謝します。 – homerjay

+1

@homer:N 'は、varcharではなくnvarcharを作成します。それは文字列引用識別子です。例、N'Thisは私の文字列です 'nvarchar、' This is my string 'はvarcharです。 sp_executesqlはnvarcharをとるため、N 'を使用しました。 –

1

アダムは問題自体の周りに多くのヒットをしましたが、これは単なる症状である根本的な問題について言及します。あなたのデータモデルはほぼ確実に悪いです。多くの(任意の)SQL開発を行う予定の場合は、データモデリングに関する入門書をお読みください。正規化の第1の規則の1つは、エンティティに反復グループを含めるべきではないということです。たとえば、ここで「phone_1」、「phone_2」と呼ばれる列など

を持つべきではありませんこのような状況をモデル化するためのより良い方法です:

CREATE TABLE Contacts (
    contact_id INT NOT NULL, 
    contact_name VARCHAR(20) NOT NULL, 
    contact_description VARCHAR(500) NULL, 
    CONSTRAINT PK_Contacts PRIMARY KEY CLUSTERED (contact_id) 
) 

CREATE TABLE Contact_Phones (
    contact_id INT NOT NULL, 
    phone_type VARCHAR(10) NOT NULL, 
    phone_number VARCHAR(20) NOT NULL, 
    CONSTRAINT PK_Contact_Phones PRIMARY KEY CLUSTERED (contact_id, phone_type), 
    CONSTRAINT CK_Contact_Phones_phone_type CHECK (phone_type IN ('HOME', 'FAX', 'MOBILE')) 
) 

、代わりにしようとしています文字列を連結してさまざまな列を扱うことができます。これらの列をセットとして扱うことができ、ビジネスロジックを通じて必要な電話番号を取得できます。 (申し訳ありませんが私はあなたの例を使用しませんでしたが、それはあまりにも一般的で理解しにくいようでした)。

関連する問題