我有一个实例,我需要在包含唯一引用列的数据库表中多次插入一条记录。我声明一个变量并使用select语句来填充变量然后运行一个insert语句。问题是当将唯一值抓取到变量中时,它只会抓取参考表中的最后一条记录。我需要在每个找到记录的位置插入insert语句。
DECLARE @ID INT;
DECLARE @RuleID INT;
SELECT @RuleID = RuleID from Rules where Rule_Name = 'VERSION_ID' and Field = 'TSH'
SELECT @ID = ID FROM CHANNELS WHERE SUBSTRING(CHANNEL_NAME,0,4) != 'HEL'
BEGIN
INSERT INTO Rule_Items
VALUES(@ID,@RuleID,0,'2.5.1','E','A',0,getdate())
END
答案 0 :(得分:1)
如果您想要所有组合,可以将insert . . . select
与cross join
:
INSERT INTO Rule_Items
select c.id, r.ruleid, 0, '2.5.1', 'E', 'A', 0, getdate()
from rules r cross join
channels c
where r.Rule_Name = 'VERSION_ID' and r.Field = 'TSH' and
SUBSTRING(c.CHANNEL_NAME, 0, 4) <> 'HEL';
答案 1 :(得分:0)
我决定使用游标并创建一个临时表。这是有效的查询。
**--BEGIN TRAN
DECLARE @Channelid INT
DECLARE @RuleID INT
SELECT @RuleID = RuleID From Rules Where Rule_Name = 'VERSION_ID'
DECLARE GetChannelId CURSOR FOR SELECT Channelid FROM HL7_Channels WHERE Channel_Name not like 'MU2%' AND Channel_Description LIKE '%outbound%'
OPEN GetChannelId
FETCH GetChannelId INTO @Channelid
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF NOT EXISTS (Select 1 From Rule_Items Where ChannelId = @Channelid AND RuleID = @RuleID)
BEGIN
INSERT INTO Rule_Items VALUES (@Channelid,@RuleID,0,'2.5.1','E','A',0,getdate())
END
FETCH GetChannelId INTO @Channelid
CONTINUE
END
CLOSE GetChannelId
DEALLOCATE GetChannelId
--ROLLBACK TRAN
--COMMIT TRAN**