我正在存储过程中构建动态插入语句。
我在变量中构建 sql 语法,然后使用EXEC(@VarcharVariable)
.
SQL 插入工作正常,但是当我SET @Record_ID = Scope_Identity()
之后执行时,我没有得到值。
我怎样才能捕捉到这个?我需要将它包装到EXEC
?
我正在存储过程中构建动态插入语句。
我在变量中构建 sql 语法,然后使用EXEC(@VarcharVariable)
.
SQL 插入工作正常,但是当我SET @Record_ID = Scope_Identity()
之后执行时,我没有得到值。
我怎样才能捕捉到这个?我需要将它包装到EXEC
?
基本示例,使用 sp_executesql
DECLARE @sql NVARCHAR(MAX)
DECLARE @Id INTEGER
SET @sql = 'INSERT MyTable (Field1) VALUES (123); SELECT @Id = SCOPE_IDENTITY()'
EXECUTE sp_executesql @sql, N'@Id INTEGER OUTPUT', @Id OUTPUT
-- @Id now has the ID in
你也可以试试这个......
CREATE PROCEDURE [dbo].[SaveSingleColumnValueFromGrid]
(
@TableName VARCHAR(200),
@ColumnName VARCHAR (200),
@CompareField VARCHAR(200),
@CompareValue VARCHAR(200),
@NewValue VARCHAR(200),
@Result INT OUTPUT
)
AS
BEGIN
DECLARE @SqlString NVARCHAR(2000),
@id INTEGER = 0;
IF @CompareValue = ''
BEGIN
SET @SqlString = 'INSERT INTO ' + @TableName + ' ( ' + @ColumnName + ' ) VALUES ( ''' + @NewValue + ''' ) ; SELECT @id = SCOPE_IDENTITY()';
EXECUTE sp_executesql @SqlString, N'@id INTEGER OUTPUT', @id OUTPUT
END
ELSE
BEGIN
SET @SqlString = 'UPDATE ' + @TableName + ' SET ' + @ColumnName + ' = ''' + @NewValue + ''' WHERE ' + @CompareField + ' = ''' + @CompareValue + '''';
EXECUTE sp_executesql @SqlString
set @id = @@ROWCOUNT
END
SELECT @Result = @id
END
是的,它应该是动态 sql 的一部分,这就是 scope_identity() 的用途