【问题标题】:How can I select the inserted values in a stored procedure?如何在存储过程中选择插入的值?
【发布时间】:2021-11-20 13:39:00
【问题描述】:

我正在使用一个在表中插入值的存储过程:ID 和当前日期。我知道如何使用 SCOPE_IDENTITY 获取上次使用的 ID,但我还需要 SELECT 刚刚插入的日期。有什么想法吗?

ALTER PROCEDURE [dbo].[sp_InsertOrderHeader]
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO OrderHeaders (OrderStateId,DateTime) VALUES (1,GETDATE()); 
    SELECT CONVERT(int, SCOPE_IDENTITY()) Id
END

【问题讨论】:

  • 或者只是将 GETDATE() 添加到您的最后一个选择语句中?尽管在这种情况下不太可能,但您可能希望将 GETDATE 分配给一个变量,以便您的代码对过程中的每个语句使用完全相同的值。然后,您只需将该变量添加到您的 select 语句而不是函数调用中。
  • 旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_ 并使用其他东西作为前缀 - 或者根本没有前缀!
  • 我已经编写了存储过程,其中有一堆已经以 sp_ 为前缀,但感谢您的提醒......这么多规则。

标签: sql sql-server tsql stored-procedures


【解决方案1】:

您可以为此使用OUTPUT 子句:

INSERT INTO OrderHeaders (OrderStateId,DateTime) 
OUTPUT inserted.OrderStateId,inserted.DateTime
VALUES (1,GETDATE()); 

OUTPUT子句用于返回所有数据修改语句中的修改值,即INSERT、DELETE、UPDATE、MERGE。与触发器一样,新值通过inserted 伪表访问,而删除/覆盖的值通过deleted 表访问

【讨论】:

    猜你喜欢
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    相关资源
    最近更新 更多