使用OUTPUT使用SELECT INSERT INTO

Bob*_*ion 4 sql t-sql sql-server

我想存储pt_id使用到我的临时表OUTPUT,但是我没有插入pt_idct_tarf,我该怎么办?

我收到以下错误:

无法绑定多部分标识符"pt_id".

查询:

DECLARE @tbl_ids_tarf TABLE (pt_id INT, pt_id_tarf INT)

INSERT INTO dbo.ct_tarf(tr_id_serv, tr_name, tr_money)
OUTPUT pt_id, inserted.tr_id INTO @tbl_ids_tarf(ptr_id, ptr_id_tarf)
   SELECT 
      pt_id_serv, pt_name, pt_money
   FROM 
      dbo.opr_prop_tar
   WHERE 
      pt_id_tarf
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 10

您的查询有几个问题 - 列命名是一个,不完整的WHERE子句是另一个,缺少的Inserted.前缀是第三个.

试试这个:

DECLARE @tbl_ids_tarf TABLE (pt_id INT, pt_id_tarf INT)

INSERT INTO dbo.ct_tarf(tr_id_serv, tr_name, tr_money)
OUTPUT inserted.pt_id, inserted.tr_id INTO @tbl_ids_tarf(pt_id, pt_id_tarf)
       *********                                         ******************
   SELECT 
      pt_id_serv, pt_name, pt_money
   FROM 
      dbo.opr_prop_tar
   WHERE 
      pt_id_tarf ........
Run Code Online (Sandbox Code Playgroud)

  • @Ashi 这个语法是正确的并且可以工作。MERGE 对于这种情况来说是多余的,OP 是在正确的轨道上,只是搞乱了语法。对于反对者...如果该列是_Identity Column_,则“inserted.pt_id”将可用,这是OP首先尝试捕获该值的一般假设。 (2认同)

Bog*_*ean 8

SQL2008 +:

假设您要从未返回的列或虚拟表中插入@tbl_ids_tarf(其为OUTPUT ... INTO子句的目标)值,则一种解决方案是使用MERGE语句而不是:inserteddeletedINSERT

DECLARE @Target TABLE (
    Col1 INT
)
INSERT  @Target VALUES (1), (2);

DECLARE @Output TABLE (Col1 INT, ColB INT);

;WITH Source
AS (
    SELECT  * 
    FROM    (VALUES (10, 100), (20, 200), (30, 300)) x(ColA, ColB)
)
MERGE INTO @Target x
USING Source y ON x.Col1 = y.ColA
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (Col1) VALUES (y.ColA)
OUTPUT inserted.Col1, y.ColB INTO @Output (Col1, ColB); 
--                     ^-- y.ColB isn't returned by inserted or deleted virtual tables. 
-- inserted and deleted are based on `@Target` table [variable]

SELECT * FROM @Output;
/*
Col1        ColB
----------- -----------
10          100
20          200
30          300
*/
Run Code Online (Sandbox Code Playgroud)