我对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中执行此逻辑的帮助对这个新手都有很大的帮助。
答案 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关键字也与更新查询一起使用。你的问题在插入查询中有错误。