循环遍历SQL中的SELECT结果集
发布时间:2020-12-12 06:52:54 所属栏目:MsSql教程 来源:网络整理
导读:我甚至不确定怎么说这个问题但是这里有.我需要能够在同一个SQL脚本中循环遍历结果集,并在更多SQL中使用结果. 例如 beginSELECT (SELECT ColumnA,ColumnB from SomeTable) as xloop through x( INSERT ColumnA into TableA INSERT ColumnB into TableB )end 但
我甚至不确定怎么说这个问题但是这里有.我需要能够在同一个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; Example on SQL Fiddle (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |