这个问题实际上是两个部分。第一部分只是插入到带有临时表的真实表中,并将输出插入到另一个临时表中是行不通的。这是示例。
Insert Into student
Output INSERTED.*
Into #StudentsOutput
Select *
From #StudentsResult
当我将鼠标悬停在上面时出现错误。
Invalid Object name '#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
这对于我需要从旧值到新值的查找来说是完美的!以下错误。
The multi-part identifier 's.student_id' could not be bound.
最佳答案
第一个问题(您必须创建两个临时表):
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
Specifies a table that the returned rows are inserted into instead of being returned to the caller. output_table may be a temporary 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)
关于SQL从临时表插入表,并将输出插入临时表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45738981/