如果条件为真,则将数据插入表中

时间:2014-05-22 22:30:48

标签: sql

SQL语句问题

我有一个实例,我需要在包含唯一引用列的数据库表中多次插入一条记录。我声明一个变量并使用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

2 个答案:

答案 0 :(得分:1)

如果您想要所有组合,可以将insert . . . selectcross 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**