如何在 StoredProcedure 中使用 sp_executesql 获取最后一个标识值?
How to get the last identity value using sp_executesql in StoredProcedure?
我正在使用 stored procedure
和 sp_executesql
插入记录。使用 sp_executesql
插入记录后,我需要该会话中最后插入的 identity
字段值。
ALTER proc [dbo].[spHoldTransaction]
@RegisterNo int,
@StoreID int,
@Department varchar(50),
@TransactionDateFrom date,
@TransactionDateTo date,
@Comment Varchar(50)
AS
BEGIN
DECLARE @RegisterID int;
DECLARE @DatabaseName varchar(15);
DECLARE @Batch int;
SELECT @RegisterID=ID FROM Register WHERE Register.Number = @RegisterNo;
SELECT @Batch = BatchNumber From Batch WHERE Status = 0 and RegisterID = @RegisterID
SET @DatabaseName = 'xxx'
SELECT @Department=''''+REPLACE(@Department,',',''',''')+''''
DECLARE @Qry nvarchar(MAX);
DECLARE @ParamDefinition nvarchar(MAX);
SET @ParamDefinition = N'@comment nvarchar(50),@StoreID int,@Batch int'
SET @Qry = '
INSERT INTO '+@DatabaseName+'.dbo.TransactionHold
(
[StoreID]
,[HoldComment]
,[BatchNumber]
,[ShippingNotes]
)
SELECT
@StoreID AS [StoreID]
,@Comment AS [HoldComment]
,@Batch AS [BatchNumber]
,'''' AS [ShippingNotes];
'
EXECUTE sp_executesql @Qry, @ParamDefinition, @Comment, @StoreID, @Batch
SELECT SCOPE_IDENTITY()
END
当我执行上述存储过程时,它 return 是空的。但是 TransactionHold
有标识列 Id
尝试在执行 sql 过程的同一范围内检索标识,并 return 将值作为 OUT
参数。做这些改变:
SET @ParamDefinition = N'@comment nvarchar(50),@StoreID int,@Batch int, @identity int out'
SET @Qry = '
INSERT INTO '+@DatabaseName+'.dbo.TransactionHold
(
[StoreID]
,[HoldComment]
,[BatchNumber]
,[ShippingNotes]
)
SELECT
@StoreID AS [StoreID]
,@Comment AS [HoldComment]
,@Batch AS [BatchNumber]
,'''' AS [ShippingNotes];
SET @identity = @@IDENTITY
'
DECLARE @identity INT
EXECUTE sp_executesql @Qry, @ParamDefinition, @Comment, @StoreID, @Batch, @identity OUT
SELECT @identity
我正在使用 stored procedure
和 sp_executesql
插入记录。使用 sp_executesql
插入记录后,我需要该会话中最后插入的 identity
字段值。
ALTER proc [dbo].[spHoldTransaction]
@RegisterNo int,
@StoreID int,
@Department varchar(50),
@TransactionDateFrom date,
@TransactionDateTo date,
@Comment Varchar(50)
AS
BEGIN
DECLARE @RegisterID int;
DECLARE @DatabaseName varchar(15);
DECLARE @Batch int;
SELECT @RegisterID=ID FROM Register WHERE Register.Number = @RegisterNo;
SELECT @Batch = BatchNumber From Batch WHERE Status = 0 and RegisterID = @RegisterID
SET @DatabaseName = 'xxx'
SELECT @Department=''''+REPLACE(@Department,',',''',''')+''''
DECLARE @Qry nvarchar(MAX);
DECLARE @ParamDefinition nvarchar(MAX);
SET @ParamDefinition = N'@comment nvarchar(50),@StoreID int,@Batch int'
SET @Qry = '
INSERT INTO '+@DatabaseName+'.dbo.TransactionHold
(
[StoreID]
,[HoldComment]
,[BatchNumber]
,[ShippingNotes]
)
SELECT
@StoreID AS [StoreID]
,@Comment AS [HoldComment]
,@Batch AS [BatchNumber]
,'''' AS [ShippingNotes];
'
EXECUTE sp_executesql @Qry, @ParamDefinition, @Comment, @StoreID, @Batch
SELECT SCOPE_IDENTITY()
END
当我执行上述存储过程时,它 return 是空的。但是 TransactionHold
有标识列 Id
尝试在执行 sql 过程的同一范围内检索标识,并 return 将值作为 OUT
参数。做这些改变:
SET @ParamDefinition = N'@comment nvarchar(50),@StoreID int,@Batch int, @identity int out'
SET @Qry = '
INSERT INTO '+@DatabaseName+'.dbo.TransactionHold
(
[StoreID]
,[HoldComment]
,[BatchNumber]
,[ShippingNotes]
)
SELECT
@StoreID AS [StoreID]
,@Comment AS [HoldComment]
,@Batch AS [BatchNumber]
,'''' AS [ShippingNotes];
SET @identity = @@IDENTITY
'
DECLARE @identity INT
EXECUTE sp_executesql @Qry, @ParamDefinition, @Comment, @StoreID, @Batch, @identity OUT
SELECT @identity