【问题标题】:SQL Declare Select Insert [closed]SQL声明选择插入[关闭]
【发布时间】:2013-03-24 16:38:15
【问题描述】:

我正在尝试让此查询在选择的所有结果上运行。
但问题是 select from LOG_ITEM201303 只返回一个结果。
因此,这意味着每次运行此脚本时,INSERT INTO 子句只会影响一行。
但我想要做的是获取所有结果(总共 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())

【问题讨论】:

  • 其实NO,不是重复的。 :)
  • 好的-主要问题是您选择变量-仅适用于单行-因为每个变量只能保存一个值。您需要做的是直接从SELECT 插入到目标表中 - 不使用中间的任何变量......或者如果您需要使用相同的数据进行多次插入,您需要存储结果来自表变量中的初始SELECT(不是每行的单个变量)

标签: sql sql-server select insert


【解决方案1】:

主要问题是您选择单个变量 - 仅适用于单行 - 因为每个变量只能保存一个值。另外:对于一般的 SQL,您应该避免“逐行”(也称为 RBAR - row-by-agonizing-row em>) 方法 - 这只是一个糟糕的设计,并且会扼杀您从基于集合的方法中获得的任何性能。尽可能避免它!

您需要做的是将数据直接从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    

【讨论】:

  • 谢谢。我想我明白了。我注意到的还有一个问题。我会努力解决的。
  • 上次查询好像有问题。它应该递增地输入 MailItemIndex 和 MailListIndex。每个条目+1。但是当我检查数据时,它显示如果查询运行了 3 次,它也会增加 +3。它应该只按 1 执行。例如 MailListIndex:11、12、13、14、15。会发生什么:11、14、17……等等……
  • 似乎是最好的我在循环中查询。
猜你喜欢
  • 1970-01-01
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-26
  • 2014-10-05
  • 2011-05-30
相关资源
最近更新 更多