SQL从临时表插入表,并将ouput id插入临时表

时间:2017-08-17 15:16:45

标签: sql sql-server tsql

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

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'。

1 个答案:

答案 0 :(得分:2)

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

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

     

指定将返回的行插入的表,而不是返回给调用者。 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 pseudotable的列。

如果您还需要参考来源,则必须切换到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)