web-dev-qa-db-ja.com

SQL Server 2008 Insert with WHILE LOOP

次のような既存のレコードがあります

ID    Hospital ID     Email                Description 
1       15         [email protected]           Sample Description
2       15         [email protected]          Random Text

WHILEループを使用して、病院IDが特定の値(この場合は32)に変更される行を挿入する必要がありますが、その他(自動生成されるIDではない)は一定のままです。

それは次のようになります

ID    Hospital ID     Email                Description 
1       15         [email protected]           Sample Description
2       15         [email protected]          Random Text
3       32         [email protected]           Sample Description
4       32         [email protected]          Random Text

上記には、IDと病院IDが異なる2つの新しい行があります。 IDは自動生成されます。

同じ更新を行う必要のあるテーブルがいくつかあります。 whileループでこれを行うことができる場合、カーソルは使用しません。

[〜#〜] edit [〜#〜]より単純な解決策として受け入れられた回答でwhileループが放棄されました。

6
Mukus

IDがID列であると仮定すると:

INSERT INTO TheTable(HospitalID, Email, Description)
SELECT 32, Email, Description FROM TheTable
WHERE HospitalID <> 32

SQLのループを回避してください。代わりにセットの観点から考えてみてください。

12
John Saunders

まず第一に、ほとんどの場合、特に本番環境ではSQLのループを回避する必要があるというジョン・サンダースに100%同意します。

しかし、時々、テスト目的でテーブルに100個のレコードを入力することは、ループを使用するのにふさわしいことです。

たとえば、病院のIDが16〜100のレコードをテーブルに入力し、使用した電子メールと説明を明確にする場合

CREATE PROCEDURE populateHospitals
AS
DECLARE @hid INT;
SET @hid=16;
WHILE @hid < 100
BEGIN 
    INSERT hospitals ([Hospital ID], Email, Description) 
    VALUES(@hid, 'user' + LTRIM(STR(@hid)) + '@mail.com', 'Sample Description' + LTRIM(STR(@hid))); 
    SET @hid = @hid + 1;
END

そして結果は

ID   Hospital ID Email            Description          
---- ----------- ---------------- ---------------------
1    16          [email protected]  Sample Description16 
2    17          [email protected]  Sample Description17 
...                                                    
84   99          [email protected]  Sample Description99 
19
peterm