T-SQL在不使用Cursor的情况下将结果集中的每条记录添加到现有表中?

时间:2014-02-27 18:06:07

标签: sql sql-server tsql loops cursor

我对T-SQL很陌生,我正在寻找一种方法,将来自不同选择查询的每条记录添加到具有该记录名称的现有表中。我可能需要使用变量和循环,只是不确定如何在没有光标的情况下完成这项工作,因为我被告知不要使用光标。

这就是我的意思(用于解释我需要的东西,我知道这不是sql的格式):

DECLARE @thename
DECLARE @record

SET @thename = (SELECT DISTINCT name FROM tableone) 

FOR EACH @record IN @thename
{
INSERT INTO tabletwo
SET @record = SCOPE_IDENTITY()
}

我正在使用scope_identity,因为当记录被添加到tabletwo时,会给出一个自动增量ID,我稍后需要引用它。任何关于如何在T-SQL中执行此逻辑的帮助对这个新手都有很大的帮助。

2 个答案:

答案 0 :(得分:1)

这取决于您稍后需要对身份值执行的操作。如果你真的需要每个值,一次一个,运行一些程序代码(比如执行存储过程),你需要某种WHILE循环(有或没有CURSOR,但很可能)。

但是,性能最佳的代码通常会使用新标识值列表作为集合。以下是使用OUTPUT关键字捕获新创建的标识值的方法:

-- Set up sample data.

DECLARE @SampleNames TABLE
(
    SampleName varchar(500)
);
INSERT INTO @SampleNames (SampleName) VALUES ('Fred');
INSERT INTO @SampleNames (SampleName) VALUES ('Nancy');
INSERT INTO @SampleNames (SampleName) VALUES ('Jim');
INSERT INTO @SampleNames (SampleName) VALUES ('Nancy');
INSERT INTO @SampleNames (SampleName) VALUES ('Jim');

-- Set up your "tabletwo" destination table

DECLARE @DestinationTable TABLE
(
    DestinationTableID int IDENTITY,
    DestinationTableName varchar(500)
);

-- Set up a holding place for your new IDs

DECLARE @ListOfIDs TABLE
(
    DestinationTableID int,
    UniqueName varchar(500)
);

-- Insert the distinct list of names into the destination table, capturing the generated identity values

INSERT INTO @DestinationTable
(
    DestinationTableName
)
OUTPUT
    INSERTED.DestinationTableID,
    INSERTED.DestinationTableName
INTO @ListOfIDs
    (
        DestinationTableID,
        UniqueName
    )
SELECT
    DISTINCT
    SampleName
FROM    @SampleNames;

-- @ListOfIDs will now contain all of your new IDs.

SELECT
    DestinationTableID,
    UniqueName
FROM    @ListOfIDs;

如果您确实需要为每个唯一名称执行过程代码,那么您将很难避免使用CURSOR,并且您将无法避免WHILE循环。您可以通过使用SQL Server的XML功能将唯一值连接到字符串中来避免使用CURSOR,然后在循环中使用一些字符串操作来提取单个值。这在技术上可以避免使用CURSOR,但它不太可能具有优越的性能。

答案 1 :(得分:0)

这是您想要构建查询的方式

insert into table2
(field1, field2, etc)
select field3, field4, etc
from table1
where whatever

set关键字也与更新查询一起使用。你的问题在插入查询中有错误。