SP_EXECUTESQL 和输出参数

问题描述 投票:0回答:3

我想从查询中获取 ID,但我得到的是 NULL,我的错误在哪里?

DECLARE @TblZimz    NVARCHAR(256)
DECLARE @IdModul    INTEGER
DECLARE @Id         INTEGER

SET @TblZimz        = '_ZIMZ000001'
SET @IdModul        = 1
--SET @Id               = -1

EXECUTE [InsertZimz] @TblZimz, @IdModul, @Id OUTPUT




ALTER PROCEDURE [InsertZimz]
@TblZimz    NVARCHAR(256)
, @IdModul  NVARCHAR(256)
, @Id       INTEGER OUTPUT

            DECLARE @SqlQuery NVARCHAR(MAX)
        SET @SqlQuery = 'SELECT TOP (1) ([ID]) FROM ' + @TblZimz + ' WHERE [ModulId] = ' + @IdModul

        EXEC SP_EXECUTESQL @SqlQuery, N'@Id INTEGER OUTPUT', @Id OUTPUT

为什么@Id参数总是为空?我看不到我的错误?

sql sql-server t-sql stored-procedures
3个回答
28
投票

首先,使用

id
在输出变量中选择所需的
@Id = ([ID])
,然后使用
@Id OUTPUT
@Id
变量中分配此
@Id = @Id OUTPUT
值。另外,您应该使用变量在 where 子句中传递数据,以避免像
[ModulId] = @IdModul
这样的 sql 注入问题(即您不应该像
[ModulId] = ' + @IdModul
一样连接它)。试试这个:

DECLARE @SqlQuery NVARCHAR(MAX)

SET @SqlQuery = 'SELECT TOP (1) @Id = ([ID]) FROM '
                + @TblZimz + ' WHERE [ModulId] = @IdModul'

EXEC SP_EXECUTESQL
  @SqlQuery,
  N'@Id INT OUTPUT, @IdModul INT',
  @IdModul = @IdModul,
  @Id = @Id OUTPUT 

查看

SP_EXECUTESQL
这里

的详细信息

3
投票

喜欢Deepak的答案,但更简单:

执行 SP_EXECUTESQL @SqlQuery,
N'@Id INT 输出,@IdModul INT',
@IdModul 输出,@Id


2
投票

这是一个返回动态定义的过程的返回值(而不是选择表结果)的示例:

CREATE PROC p AS return 3
GO
DECLARE @proc varchar(30) = 'p', @retval int
DECLARE @qry nvarchar(max) = 'EXEC @i = ' + @proc --plus params as needed
EXEC sp_executesql @qry, N'@i INT OUTPUT', @retval OUTPUT
select @retval      --returns 3

(用例:为了进行完整的“数据运行”,我将光标浏览要执行的过程列表,每个过程都会返回一个行数以用于记录目的。在破解这个问题之前我已经追了很久了。)

© www.soinside.com 2019 - 2024. All rights reserved.