标签: output-clause

@@ IDENTITY,SCOPE_IDENTITY(),OUTPUT和其他检索最后一个身份的方法

我已经看到在插入后检索主键标识字段的值时使用的各种方法.

declare @t table (
    id int identity primary key,
    somecol datetime default getdate()
)
insert into @t
default values

select SCOPE_IDENTITY() --returns 1
select @@IDENTITY --returns 1
Run Code Online (Sandbox Code Playgroud)

在插入后返回标识表:

Create Table #Testing (  
    id int identity,  
    somedate datetime default getdate()  
)  
insert into #Testing  
output inserted.*  
default values   
Run Code Online (Sandbox Code Playgroud)

什么方法适当或更好?OUTPUT方法是否范围安全?

第二个代码片段是从Wild中的SQL借来

sql t-sql sql-server identity output-clause

59
推荐指数
5
解决办法
9万
查看次数

在 INSERT 语句中将 OUTPUT INTO 与 from_table_name 一起使用

Microsoft 的 OUTPUT Clause 文档表示您可以在 OUTPUT 子句的列名中使用from_table_name 。

有两个例子:

是否也可以在INSERT 语句中使用它?

INSERT INTO T ( [Name] )
OUTPUT S.Code, inserted.Id INTO @TMP -- The multi-part identifier "S.Code" could not be bound.
SELECT [Name] FROM S;
Run Code Online (Sandbox Code Playgroud)

使用表变量的失败示例

-- A table to insert into.
DECLARE @Item TABLE (
    [Id] [int] IDENTITY(1,1),
    [Name] varchar(100)
);
-- A table variable to store inserted Ids …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server output-clause

8
推荐指数
1
解决办法
3264
查看次数

在SQL Server 2005中输出到临时表

我试图在存储过程中使用OUTPUT子句将一个indentity列的值输出到临时表.INSERT

CREATE TABLE #Test
(
    ID INT
)

INSERT INTO [TableB] OUTPUT INSERTED.ID #Test SELECT * FROM [TableA]
Run Code Online (Sandbox Code Playgroud)

但是,当我执行此过程时,SQL Server向我显示调用的表(正确)中的结果,Test但如果我将其写SELECT * FROM #Test为存储过程中的下一个语句,则它不显示任何内容.我怎样才能有效地完成这项工作?

sql-server-2005 output-clause

6
推荐指数
1
解决办法
2万
查看次数

SQL Server OUTPUT子句

我有点陷入困境,为什么我似乎无法通过下面的语句获得插入行的"新标识".SCOPE_IDENTITY()只返回null.

declare @WorkRequestQueueID int
declare @LastException nvarchar(MAX)
set @WorkRequestQueueID = 1
set @LastException = 'test'

set nocount off

DELETE dbo.WorkRequestQueue
OUTPUT
        DELETED.MessageEnvelope,
        DELETED.Attempts,
        @LastException,
        GetUtcdate(), -- WorkItemPoisened datetime
        DELETED.WorkItemReceived_UTC
    INTO dbo.FaildMessages
FROM dbo.WorkRequestQueue
WHERE
    WorkRequestQueue.ID = @WorkRequestQueueID

IF @@ROWCOUNT = 0 
  RAISERROR ('Record not found', 16, 1) 

SELECT Cast(SCOPE_IDENTITY() as int) 
Run Code Online (Sandbox Code Playgroud)

任何援助都将非常感激.

现在我使用这样的解决方法.

declare     @WorkRequestQueueID int
declare @LastException nvarchar(MAX)
set @WorkRequestQueueID = 7
set @LastException = 'test'

set nocount on
set xact_abort on 

DECLARE @Failed TABLE 
(
    MessageEnvelope …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server scope-identity output-clause

6
推荐指数
1
解决办法
4630
查看次数

SQL Server:多输出子句

我有两张桌子,Table_1Table_2.

Table_1有列PK(自动增量int)和Value(nchar(10)).

Table_2has FK(int),Key(nchar(10))和Value(nchar(10)).

也就是说,Table_1是一个数据表,并且Table_2是一个键值存储,其中一行Table_1可以对应于0,1个或更多个键和值Table_2.

我想编写一个代码,以编程方式构建一个查询,该查询将一行插入到Table_1可变行数中,并Table_2使用主键Table_1.

我可以用一行轻松完成:

INSERT INTO Table_1 ([Value])
OUTPUT INSERTED.PK, 'Test1Key', 'Test1Val' INTO Table_2 (FK, [Key], [Value])
VALUES ('Test')
Run Code Online (Sandbox Code Playgroud)

但SQL似乎不喜欢有多行的想法.这失败了:

INSERT INTO Table_1 ([Value])
OUTPUT INSERTED.PK, 'Test1Key', 'Test1Val' INTO Table_2 (FK, [Key], [Value])
OUTPUT INSERTED.PK, 'Test2Key', 'Test2Val' INTO …
Run Code Online (Sandbox Code Playgroud)

sql-server output-clause

6
推荐指数
1
解决办法
9382
查看次数

使用 OUTPUT 子句从 SELECT INSERT 语句检索原始和新的身份映射

我有一个包含两列的表:

CREATE TABLE MyTable(
  Id int IDENTITY(1,1) NOT NULL,
  Name nvarchar(100) NOT NULL);
Run Code Online (Sandbox Code Playgroud)

我想使用 SELECT INSERT 语句复制数据:

INSERT INTO MyTable (Name)
SELECT Name FROM MyTable
Run Code Online (Sandbox Code Playgroud)

这是棘手的部分 - 我想检索原始身份和新身份之间的映射表:

DECLARE @idsMap TABLE (OriginalId int, NewId int)
Run Code Online (Sandbox Code Playgroud)

我知道我应该使用OUTPUT 子句,但由于某种原因它不起作用:

INSERT INTO MyTable (Name)
OUTPUT t.Id, INSERTED.Id INTO @idsMap (OriginalId, NewId)
SELECT Name FROM MyTable t
-- Returns error The multi-part identifier "t.Id" could not be bound.
Run Code Online (Sandbox Code Playgroud)

相关问题:
SQL插入使用select可以返回多个身份吗?
可以使用表参数插入,并检索标识值吗?

sql-server output-clause select-insert

6
推荐指数
1
解决办法
1764
查看次数

输出子句:无法绑定多部分标识符

我正在运行我目前正在处理的存储过程中可怕的"多部分标识符无法绑定"错误.关于下面的查询,我有几个问题.

  1. 为什么我收到此错误?
  2. 为什么在ImportFundingDateTime而不是FloorplanId上发生此错误,因为它们都来自同一个查询,但是在输出子句中首先列出了FloorplanId?
  3. 我是否可以调整此查询以避免错误,同时仍保持一般结构相同?

.

DECLARE @Results                Table(
    [FloorPlanId]               UNIQUEIDENTIFIER,
    [ImportFundingDateTime]     DATETIME,
    [TimeStamp]                 VARBINARY(8),
    [BusinessId]                UNIQUEIDENTIFIER
    )

UPDATE CacRecord 
    SET MatchFound = 1
    OUTPUT  fp.[FloorplanId], cr.[ImportFundingDateTime],
            fp.[TimeStamp], buyer.[BusinessId]
    INTO @Results(  [FloorplanId], [ImportFundingDateTime], 
                    [TimeStamp], [BusinessId])
    FROM CacRecord cr WITH (NOLOCK)
    INNER JOIN CacBatch cb WITH (NOLOCK)
        ON cr.CacBatchId = cb.CacBatchId
    INNER JOIN Floorplan fp WITH (NOLOCK)
        ON fp.UnitVIN = cr.ImportVin
        AND COALESCE(fp.UnitVIN, '') <> ''
    INNER JOIN Business buyer WITH (NOLOCK)
        ON buyer.BusinessId = fp.BuyerBusinessId
    LEFT OUTER JOIN BusinessContact bc WITH …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server-2008 output-clause

5
推荐指数
1
解决办法
5031
查看次数

如何在SQL中使用output子句输出插入,更新,删除结果到新的临时表?

目前,我正在尝试update在SQL Server中执行(但它可能是任何支持该子句的DML语句),并且我想将输出放入本地临时表中,如下所示:output

update
    dbo.MyTable
set
    MyField = 30
output
    inserted.MyKeyField
into
    #myTempTable
from
    dbo.MyTable as t
where
    f.MyFilteredField = 8 
Run Code Online (Sandbox Code Playgroud)

我知道语法是正确的,根据output条款的文档(强调我的):

output_table

指定将返回的行插入的表,而不是返回给调用者.output_table可以是临时表.

这就是说,我希望它的工作就像它会在该into条款select,它只会创建表的语句.

但是,我收到以下错误:

无效的对象名称'#myTempTable'.

如何将output子句(inserteddeleted)的结果导入临时表?

sql t-sql output-clause

5
推荐指数
1
解决办法
9202
查看次数

输出子句 VS 触发器

在我们的数据库中,大多数表都有一个dbupddate字段指示datetime最后一个INSERTUPDATE应用于该行。

为了避免该字段具有错误的值,存在触发器(有时AFTER,有时INSTEAD OF)来确保最终该值是正确的,而不是有人尝试写入该字段的任何“手动”其他值。

现在我正在执行更新语句(实际上MERGE),并且我想要一个OUTPUT包含该字段的子句。正如我在相应的 MS 文章中读到的,OUTPUT忽略触发器。

是否有任何解决方法可以返回触发器后的OUTPUT值?dbupddate我不想进行另一个查询来绘制信息,因为我不能保证在这些查询之间的瞬间,另一个用户的第三个查询可能不会改变所有内容。


遵循 Larnu 的建议后的结果

我运行了提供的示例,唯一的例外是将字段default的值更改updatetime为,convert(datetime2,'1900-01-01')以便我可能有意义。我运行了 4 个查询中的每一个,然后从各自的表中进行选择并比较了值updatetime

INSERT INTO dbo.Sample1 (Someint)
OUTPUT inserted.*
INTO @inserted
SELECT 1;

SELECT 'Sample1 INSERT',*
FROM @inserted; -- 1900-01-01 00:00:00.000000
select * from Sample1  -- 2018-11-05 13:12:13.141580
Run Code Online (Sandbox Code Playgroud)

我猜这里的输出会忽略触发器并返回after触发器生效之前插入的默认值。

DECLARE @inserted table (ID int, Someint int, …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server output-clause database-trigger

5
推荐指数
1
解决办法
3225
查看次数

存储过程与表值函数的OUTPUT子句

我正在攻读MCTS 70-433"数据库设计"证书,在我正在研究的文本中,其中一个自测有这个问题.

您有一个名为Get_NewProducts的存储过程.您希望将此存储过程的结果插入到Production.Product表中,并使用OUTPUT子句输出INSERTED.*值.做这个的最好方式是什么?

有四种可能的答案.前三个选项是" INSERT ... OUTPUT ... EXECUTE Get_NewProducts "语句的所有变体.第四个选择D简单地说"将存储过程重写为表值函数".

D是正确的答案.我不太明白为什么,文中没有任何内容可以解释它.有人有任何见解吗?

t-sql sql-server stored-procedures sql-server-2008 output-clause

2
推荐指数
1
解决办法
1879
查看次数

DELETE ... OUTPUT COUNT(DELETED.*)

我想知道在某个DELETE操作中删除了多少行.

我把微软例B

DELETE Sales.ShoppingCartItem
OUTPUT DELETED.* 
WHERE ShoppingCartID = 20621;
Run Code Online (Sandbox Code Playgroud)

并尝试修改它只返回count已删除的记录:

DELETE FROM datacache 
OUTPUT COUNT(DELETED.*)
WHERE userId=@id
Run Code Online (Sandbox Code Playgroud)

但这引发了

ExceptionMessage: "Incorrect syntax near '*'."
ExceptionType: "System.Data.SqlClient.SqlException"
Message: "Error"
Run Code Online (Sandbox Code Playgroud)

所以我试过了

DELETE FROM datacache 
OUTPUT COUNT(DELETED)
WHERE userId=@id
Run Code Online (Sandbox Code Playgroud)

哪个扔了

ExceptionMessage: "Invalid column name 'DELETED'."
ExceptionType: "System.Data.SqlClient.SqlException"
Message: "Error"
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

sql sql-server output-clause

2
推荐指数
2
解决办法
5990
查看次数

如何使用SQL Server中的OUTPUT将多个列插入表中?

向下滚动到OUTPUT部分.它给了我一个红色的下划线.我想在InsertedCreditDebitAdjustmentIDs表格中插入@CreditDebitAdjustment与InvoiceNum一起插入的ID .我该怎么做呢?

DECLARE @InsertedCreditDebitAdjustmentIDs TABLE
(
  ID INT,
  InvoiceNumber VARCHAR(50)
)

INSERT INTO @CreditDebitAdjustment ( col1, col2, ...)
SELECT  @ImportedFileID AS '@ImportedFileID', 
  tbl.col.value('(Purpose/text())[1]', 'VARCHAR(500)') AS Purpose,
  etc.
FROM @XML.nodes('/CreditDebitAdjustments/CreditDebitAdjustment') AS tbl (col)
OUTPUT INSERTED.CreditDebitAdjustmentID, etc. INTO @InsertedCreditDebitAdjustmentIDs 
Run Code Online (Sandbox Code Playgroud)

sql sql-server output-clause

1
推荐指数
1
解决办法
4436
查看次数