我甚至不确定怎么说这个问题但是这里有.我需要能够在同一个sql脚本中循环遍历结果集,并在更多sql中使用结果.
例如
begin SELECT (SELECT ColumnA,ColumnB from SoMetable) as x loop through x( INSERT ColumnA into TableA INSERT ColumnB into TableB ) end
但我忘了这样做的确切方法.我知道我之前的位置已经完成了,但我找不到该公司文件中的代码.
显然,这是一个非常粗略和基本的例子,我计划用结果集做更多的事情,但我只是以此为例.
编辑:以下是我希望做的更接近的例子,以防这有用.
begin while(select columnA,columnB,columnC,columnD from myTable) as x begin INSERT columnA,columnB into TableA (get newly created ID of TableA - but that's a separate question involving @@IDENTITY) INSERT NewID,columnD into TableB end loop end
解决方法
处理以集合方式获取身份的常用方法是通过
OUTPUT
条款:
INSERT INTO TableA (ColumnA,ColumnB) OUTPUT inserted.Id,inserted.ColumnA,inserted.ColumnB SELECT ColumnA,ColumnB FROM MyTable;
这里的问题是你理想的做法是:
INSERT INTO TableA (ColumnA,MyTable.ColumnC,inserted.ColumnD INTO TableB (AID,ColumnC,ColumnD) SELECT ColumnA,ColumnB FROM MyTable;
问题是您无法在OUTPUT中引用源表,只能引用目标.幸运的是,有一个使用MERGE的解决方法,因为这允许您使用引用驻留内存插入表和输出子句中的源表,如果您在永远不会为真的情况下使用MERGE您可以输出所有你需要的列:
WITH x AS ( SELECT ColumnA,ColumnB,ColumnD FROM MyTable ) MERGE INTO TableA AS a USING x ON 1 = 0 -- USE A CLAUSE THAT WILL NEVER BE TRUE WHEN NOT MATCHED THEN INSERT (ColumnA,ColumnB) VALUES (x.ColumnA,x.ColumnB) OUTPUT inserted.ID,x.ColumnC,x.ColumnD INTO TableB (NewID,ColumnD);
此方法的问题是sql Server不允许您插入外键关系的任何一侧,因此如果tableB.NewID引用tableA.ID,则上述操作将失败.要解决此问题,您需要输出到临时表,然后将临时表插入TableB:
CREATE TABLE #Temp (AID INT,ColumnC INT,ColumnD INT); WITH x AS ( SELECT ColumnA,x.ColumnD INTO #Temp (AID,ColumnD); INSERT TableB (AID,ColumnD) SELECT AID,ColumnD FROM #Temp;