循环遍历SQL中的SELECT结果集

我甚至不确定怎么说这个问题但是这里有.我需要能够在同一个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

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...