T-SQL是否在不使用游标的情况下将resultset中的每条记录添加到现有表中?

T-SQL是否在不使用游标的情况下将resultset中的每条记录添加到现有表中?,sql,sql-server,tsql,loops,cursor,Sql,Sql Server,Tsql,Loops,Cursor,我对T-SQL非常陌生,我正在寻找一种方法,将不同select查询中的每条记录添加到具有该记录名称的现有表中。我可能需要使用变量和循环,只是不确定在没有游标的情况下如何实现,因为有人告诉我不要使用游标 以下是我的意思(使用for each解释我需要什么,我知道这不是sql的格式): 我之所以使用scope_identity,是因为当一条记录被添加到tabletwo时,它会被赋予一个自动递增id,我以后需要引用它。关于如何在T-SQL中执行此逻辑的任何帮助都将对新手有很大帮助。这是您构建查询的方式

我对T-SQL非常陌生,我正在寻找一种方法,将不同select查询中的每条记录添加到具有该记录名称的现有表中。我可能需要使用变量和循环,只是不确定在没有游标的情况下如何实现,因为有人告诉我不要使用游标

以下是我的意思(使用for each解释我需要什么,我知道这不是sql的格式):


我之所以使用scope_identity,是因为当一条记录被添加到tabletwo时,它会被赋予一个自动递增id,我以后需要引用它。关于如何在T-SQL中执行此逻辑的任何帮助都将对新手有很大帮助。

这是您构建查询的方式

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

set关键字也与update查询一起使用。您的问题位于insert查询中,该查询将抛出错误。

这取决于您以后需要如何处理标识值。如果您确实需要每个值(一次一个)来运行一些过程代码(例如执行存储过程),那么您将需要某种WHILE循环(带或不带游标,但很可能带)

但是,性能最好的代码通常将新标识值列表作为一个集合使用。以下是如何使用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;

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

所以我不必对来自不同查询的每条记录进行任何迭代?我会自动添加每一个吗?如果我需要将每条记录设置为其自己的作用域标识,以便以后引用它,那么这将如何影响插入?然后使用OUTPUt子句获取整套idsCan tabletwo have REPLICATES name?如果答案是否定的,那么name就是一个候选键。您不必逐个检索ID。
-- 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;