SP_EXECUTESQL和输出参数

时间:2014-12-15 14:15:43

标签: sql sql-server tsql stored-procedures

我想从查询中获取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 Paramter是alwasy null?我看不出我的错误?

2 个答案:

答案 0 :(得分:10)

首先,使用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 here

的详细信息

答案 1 :(得分:0)

就像Deepak的答案一样,但更简单:

  

EXEC SP_EXECUTESQL @SqlQuery,
  N'@ Id INT输出,@ IdModul INT',
  @IdModul输出,@ Id