这个问题实际上是两个部分。第一部分是插入带有临时表的实际表,并且将输出插入到另一个临时表中是不起作用的。这是一个例子。
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'。
答案 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)