2014-09-19 47 views
0

这个问题建立在我的previous question on conditional inserts上。我现在想解决的问题是当我使用相同的LAST_INSERT_ID(其设置为@EVENT_ID)插入多个VALUES时。我以前的C#脚本是这样的语句应该是这样的:有多个值的条件插入

INSERT INTO EVENTDETAILS (EVENT_ID, ITEMNAME, ITEMVALUE) 
VALUES (@EVENT_ID, 'SBEPN', '41420F'), (@EVENT_ID, 'Notes', 'Sent to USER2'); 

使用修改,以利用链接的问题提供了条件插入相同的C#脚本,这是我结束了(如果有只是一个单一的一套VALUES它按预期工作):

INSERT INTO EVENTDETAILS (EVENT_ID, ITEMNAME, ITEMVALUE) 
SELECT t.* FROM ( 
    SELECT @EVENT_ID, 'SBEPN', '41420F', @EVENT_ID, 'Notes', 'Sent to USER2') 
t 
WHERE @EVENT_ID IS NOT NULL; 

问题: 运行本作,是得到一个“错误代码1241操作数应包含1列(S)”。这是有道理的,根据表定义,我提供了六个数据,期望三个数据。我试着在两组,每组三个提供的数据,用括号试图仿效在上面的原剧本的VALUES条款,以及各种其他的事情,我不能去上班分离:

SELECT t.* FROM (
SELECT (@EVENT_ID, 'SBEPN', '41420F'), (@EVENT_ID, 'Notes', 'Sent to USER2')) 
t 
WHERE @EVENT_ID IS NOT NULL; 

这是可能的有多达6个这样的后续条款,他们都需要使用相同的LAST_INSERT_ID(设置为变量@EVENT_ID),因此它们与单个父行相关联。

解决方法:我知道我可以做使用三个单组数据的多个刀片,EG:

INSERT INTO EVENTDETAILS (EVENT_ID, ITEMNAME, ITEMVALUE) 
SELECT t.* FROM ( 
    SELECT @EVENT_ID, 'SBEPN', '41420F') 
t 
WHERE @EVENT_ID IS NOT NULL; 

INSERT INTO EVENTDETAILS (EVENT_ID, ITEMNAME, ITEMVALUE)  
SELECT t.* FROM (
    SELECT @EVENT_ID, 'Notes', 'Sent to USER2') 
t 
WHERE @EVENT_ID IS NOT NULL; 

问:我能做到这一点在单个插入语句模仿第一个例子中有多个VALUES语句的结果?

回答

1

这是你想要的吗?

INSERT INTO EVENTDETAILS (EVENT_ID, ITEMNAME, ITEMVALUE) 
    SELECT t.* 
    FROM (SELECT @EVENT_ID as e, 'SBEPN', '41420F' UNION ALL 
      SELECT @EVENT_ID as e, 'Notes', 'Sent to USER2' 
     ) t 
    WHERE e IS NOT NULL; 
+0

这很好,如果我不得不添加更多的子句,我可以加上另一个UNION ALL子句(已经测试过按预期工作)。非常感谢,我感谢帮助。 – delliottg 2014-09-19 17:08:31