SQL 从临时表插入表,并将输出插入临时表

Posted

技术标签:

【中文标题】SQL 从临时表插入表,并将输出插入临时表【英文标题】:SQL Inserting into table from temp table, and having ouput id inserted into temp table 【发布时间】:2017-08-17 15:16:45 【问题描述】:

这个问题实际上是两个部分。第一部分只是插入到带有临时表的真实表中,并且将输出插入到另一个临时表中不起作用。这是一个例子。

Insert Into student 
        Output INSERTED.* 
        Into #StudentsOutput
Select *
From #StudentsResult

当我将鼠标悬停在上面时出现的错误。

无效的对象名称“#StudentsOutput”

我看到的所有 msdn 示例都可以这样做,除非因为它涉及两个临时表,所以你不能这样做。

还请注意,我尝试专门为student 表和#StudentsResult 表指定列。这从上面产生了相同的结果。所以为简洁起见,我只显示上面的 tsql

下一个问题是我希望新的临时表 #StudentsOutput 包含旧的学生 ID。因为我要修改其他需要引用旧学生 ID 的表。下面的例子。

Insert Into student 
    Output INSERTED.student_id, s.student_id as [old_student_id]  
    Into #StudentsOutput
Select *
From #StudentsResult as s

这对于我需要将旧值查找到新值来说是完美的!以下错误。

无法绑定多部分标识符“s.student_id”。

【问题讨论】:

对于第二个问题,您无法使用insert 执行此操作。您需要使用merge。请参阅this 答案和this 一个。 【参考方案1】:

第一个问题(您必须创建两个临时表):

CREATE TABLE student(id INT);
CREATE TABLE #StudentsResult(id INT);
CREATE TABLE #StudentsOutput(id INT);


 Insert Into student 
        Output INSERTED.* 
        Into #StudentsOutput
 Select *
 From #StudentsResult;

RextesterDemo

来自OUTPUT

输出表

指定一个表,返回的行被插入而不是返回给调用者。 output_table 可能是临时表。

请注意,在您尝试插入之前,表应该已经存在。我想你希望它像这里一样工作:

SELECT *
INTO #temp_table     -- in this scenario table will be created automatically
FROM ...

第二期。您不需要在输出子句中使用别名。只需指定列列表INTO

Insert Into student 
        Output INSERTED.student_id, INSERTED.col_name 
        Into #StudentsOutput(col1, col2)
Select *
From #StudentsResult as s;

然后

INSERTED.student_id -> col1
INSERTED.col_name   -> col2

请注意,您只能引用来自INSERTED 伪表的列。

如果您还需要引用源,则必须切换到MERGE 语句。

 MERGE student trg
 USING @StudentResult src
   ON ...
 WHEN NOT MATCHED BY TARGET THEN 
    INSERT ...
 OUTPUT inserted.student_id, src.student_id
 INTO #StudentsOutput(col1, col2)

【讨论】:

AFAIK,您不能在插入语句的输出子句中使用来自源和目标的列,只能来自output clause of a merge statement. 在最坏的情况下。我可以在rank() row over partition... 上对#StudentsResult#StudentsOutput 进行内部连接,因为这两个表应该连续相同。但这似乎很脏。 从您的编辑看来,我需要在结果和输出临时表中的分区上使用一行。在这种情况下,合并将不起作用。 @christopherclark 我认为您的主要问题已经解决。我建议在此基础上提出新问题,准备输入数据和所需的结果集。 Rextester demo 会有很大帮助。

以上是关于SQL 从临时表插入表,并将输出插入临时表的主要内容,如果未能解决你的问题,请参考以下文章

SQL将数据插入临时表并将结果另存为视图

从其他临时表插入 SQL Server 临时表 [关闭]

从 SQL 动态结果插入临时表

将数据插入临时表

如何从存储过程返回的游标将数据插入临时表

SQL Server 从表变量插入临时表