-1

このクエリを選択のすべての結果で実行し​​ようとしています。
しかし、問題は、selectfromLOG_ITEM201303が1つの結果しか返さないことです。
つまり、INSERT INTOこのスクリプトを実行するたびに、句が1つの行にのみ影響することを意味します。
しかし、私がやりたいのは、すべての結果(合計600以上)を取得し、それらすべてを行ごとに挿入することです。

DECLARE @charkey int, @charname varchar(16), @item int

SELECT @charkey = CHAR_KEY, @charname = NAME, @item = ITEMNUM
FROM LOG_ITEM201303
where 
(   
    ITEMNUM = 14317
OR  ITEMNUM = 14318
OR  ITEMNUM = 15478
OR  ITEMNUM = 15479
OR  ITEMNUM = 14301
OR  ITEMNUM = 14302
OR  ITEMNUM = 15476
OR  ITEMNUM = 15477
OR  ITEMNUM = 15018
OR  ITEMNUM = 15019
OR  ITEMNUM = 15020
OR  ITEMNUM = 15021
OR  ITEMNUM = 15022
OR  ITEMNUM = 15023
OR  ITEMNUM = 15024
OR  ITEMNUM = 15025
OR  ITEMNUM = 14437
OR  ITEMNUM = 14438
OR  ITEMNUM = 15656
OR  ITEMNUM = 15657
OR  ITEMNUM = 15658
OR  ITEMNUM = 15659
OR  ITEMNUM = 15660
OR  ITEMNUM = 15661
OR  ITEMNUM = 15662
OR  ITEMNUM = 15663
) AND (KIND = 133) AND (Convert(varchar, OCCUR_TIME,111) < '2013/03/22')

SELECT @charkey, @charname, @item

INSERT INTO game.dbo.Mail_Item_Table
(ItemNumber, ItemInfo, ReceiveDate)
VALUES
(@item, (SELECT CONVERT(BINARY(16), REVERSE(CONVERT(BINARY(16), @item)))), NULL)

INSERT INTO game.dbo.Mail_Message_Table
(Message)
VALUES
('Automated Message from the ADMIN.')

INSERT INTO game.dbo.Mail_List_Table
(ReceiverCharKey, MailListIndex, MailItemIndex, MailMessageIndex, Sender, Receiver, SendDate)
VALUES 
(@charkey,
(SELECT TOP 1   MailListIndex+1 as last_entry
 FROM           game.dbo.Mail_List_Table
 WHERE          sender = 'SEND0R'
 ORDER BY MailListIndex DESC),
(SELECT TOP 1   MailItemIndex AS last_entry
 FROM           game.dbo.Mail_Item_Table
 ORDER BY       MailItemIndex DESC),
(SELECT TOP 1   MailMessageIndex AS last_entry
 FROM           game.dbo.Mail_Message_Table
 ORDER BY       MailMessageIndex DESC),
 'SEND0R', '@charname', getdate())
4

1 に答える 1

2

主な問題は、各変数が単一の値しか保持できないため、個々の変数(単一の行に対してのみ機能する)を選択することです。また、一般的なSQLでは、「行ごと」(RBAR - row-by-agonizing-rowとも呼ばれます)のアプローチを避ける必要があります。これは単なる悪い設計であり、セットから得られる可能性のあるパフォーマンスをすべて無効にします。ベースのアプローチ。可能な限り避けてください!

代わりに行う必要があるのは、データをターゲットテーブルに直接挿入することですSELECT -間に変数を使用しないでください...または同じデータを使用して複数の挿入を行う必要がある場合(ここでの場合のように) 、イニシャルの結果をテーブル変数に格納する必要がありSELECTます各行の個々の変数ではありません)

したがって、次のようなものを試してください。

-- define a table variable to hold the data
DECLARE @TemporaryData TABLE (charkey int, charname varchar(16), item int)

-- initial SELECT - insert data into table variable    
INSERT INTO @TemporaryData(charkey, charname, item)
   SELECT CHAR_KEY, NAME, ITEMNUM
   FROM LOG_ITEM201303
   WHERE ( ..... ) 

-- insert data from the table variable into the first table    
INSERT INTO game.dbo.Mail_Item_Table(ItemNumber, ItemInfo, ReceiveDate)
   SELECT 
       item, 
       CONVERT(BINARY(16), REVERSE(CONVERT(BINARY(16), item)))), 
       NULL
   FROM @TemporaryData

-- unrelated to the table variable ...    
INSERT INTO game.dbo.Mail_Message_Table(Message)
VALUES('Automated Message from the ADMIN.')

-- insert data from table variable into yet another table...    
INSERT INTO game.dbo.Mail_List_Table(ReceiverCharKey, MailListIndex, MailItemIndex, MailMessageIndex, Sender, Receiver, SendDate)
  SELECT
      charkey,
     (SELECT TOP 1 MailListIndex+1 as last_entry
      FROM game.dbo.Mail_List_Table
      WHERE sender = 'SEND0R'
      ORDER BY MailListIndex DESC),
     (SELECT TOP 1 MailItemIndex AS last_entry
      FROM game.dbo.Mail_Item_Table
      ORDER BY MailItemIndex DESC),
     (SELECT TOP 1 MailMessageIndex AS last_entry
      FROM game.dbo.Mail_Message_Table
      ORDER BY MailMessageIndex DESC),
     'SEND0R', 
     charname, 
     getdate()
   FROM @TemporaryData    
于 2013-03-24T17:05:34.407 に答える