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

标签 sql sql-server t-sql

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

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/

相关文章:

sql - Oracle:为什么不使用并行执行?

sql-server - 如何在不需要分布式事务的情况下存储存储过程的结果?

sql - 如何从 SQL Server 中的多个 XML 文件读取数据?

sql - 引用外部表时从子查询连接 TOP 1

SQL帮助-找到以 'somefieldId'为主键的表?

sql - 具有计数和总和的单个 MySQL 查询

sql - 在oracle中使整个列名小写

sql-server - 我应该垂直分割 table 吗?

sql-server - TClientDataSet 和大插入

sql - INSERT INTO SELECT 和 SELECT INTO 比 SELECT 花费更长的时间