Sql 如何从INSERT run in EXEC()语句中获取作用域标识()

Sql 如何从INSERT run in EXEC()语句中获取作用域标识(),sql,sql-server,scope-identity,Sql,Sql Server,Scope Identity,我正在存储过程中构建一个动态insert语句 我在变量中构建sql语法,然后使用EXEC(@VarcharVariable)执行它 SQL insert工作正常,但当我随后执行SET@Record\u ID=Scope\u Identity()时,我没有得到值 我怎样才能捕捉到这个?是否需要将其包装到EXEC?是的,它应该是动态sql的一部分,而动态sql正是使用sp\u executesql的scope\u identity()的基本示例 DECLARE @sql NVARCHAR(MAX)

我正在存储过程中构建一个动态insert语句

我在变量中构建sql语法,然后使用
EXEC(@VarcharVariable)
执行它

SQL insert工作正常,但当我随后执行
SET@Record\u ID=Scope\u Identity()
时,我没有得到值


我怎样才能捕捉到这个?是否需要将其包装到
EXEC

是的,它应该是动态sql的一部分,而动态sql正是使用sp\u executesql的scope\u identity()的基本示例

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