SQL声明选择插入
我正在尝试使此查询在select的所有结果上运行。 但问题是select from LOG_ITEM201303只返回一个结果。 这意味着每次运行此脚本时,INSERT INTO子句只影响一行。 但是我想做的是得到所有结果,总计600+并逐行插入所有结果SQL声明选择插入,sql,sql-server,select,insert,Sql,Sql Server,Select,Insert,我正在尝试使此查询在select的所有结果上运行。 但问题是select from LOG_ITEM201303只返回一个结果。 这意味着每次运行此脚本时,INSERT INTO子句只影响一行。 但是我想做的是得到所有结果,总计600+并逐行插入所有结果 DECLARE @charkey int, @charname varchar(16), @item int SELECT @charkey = CHAR_KEY, @charname = NAME, @item = ITEMNUM FROM
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())
主要的问题是您选择了单个变量-这只适用于一行-因为每个变量只能包含一个值。另外:一般来说,使用SQL时,应该避免使用逐行(也称为RBAR)方法——逐行痛苦的方法——这只是一种糟糕的设计,并且会降低从基于集合的方法中获得的任何性能。尽可能避免 您需要做的是直接从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
事实上不,它不是复制品好的-主要的问题是选择变量-这只适用于一行-因为每个变量只能包含一个值。您需要做的是直接从SELECT插入到目标表中,而不使用中间的任何变量。。。或者,如果需要使用相同的数据进行多个插入,则需要将初始SELECT的结果存储在表变量中,而不是每个行的单个变量中。我想我明白了。还有一个问题我注意到了。我会尽力解决这个问题。上次的查询似乎有问题。它应该以递增方式输入MailItemIndex和MailListIndex+每个条目1个。但是当我检查数据时,它显示如果查询运行3次,它也会增加+3。如果它只应在1之前这样做。像MailListIndex:11,12,13,14,15。发生的是:11,14,17。。。等等..这似乎是我在循环中查询的最好结果。