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 从临时表插入表,并将输出插入临时表的主要内容,如果未能解决你的问题,请参考以下文章