加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

循环遍历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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读