5

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

ID    Hospital ID     Email                Description 
1       15         abc@e.com           Sample Description
2       15         def@dd.com          Random Text

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

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

ID    Hospital ID     Email                Description 
1       15         abc@e.com           Sample Description
2       15         def@dd.com          Random Text
3       32         abc@e.com           Sample Description
4       32         def@dd.com          Random Text

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

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

承認された回答でより簡単な解決策が提供されたため、編集while ループを放棄しました。

4

2 に答える 2

21

まず第一に、ほとんどの場合、特に本番環境では SQL のループを避ける必要があるという John Saunders の意見に 100% 同意します。

しかし、テスト目的でテーブルに 100 のレコードを入力する 1 回限りのこととして、私見ですが、ループを使用することに夢中になっても問題ありません。

たとえば、あなたのケースでは、16 から 100 までの病院 ID を持つレコードをテーブルに入力し、メールと説明を区別して使用できます。

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          user16@mail.com  Sample Description16 
2    17          user17@mail.com  Sample Description17 
...                                                    
84   99          user99@mail.com  Sample Description99 
于 2013-03-03T05:27:35.837 に答える
12

IDそれが ID 列であると仮定します。

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

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

于 2013-03-03T04:58:52.737 に答える