Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SP_EXECUTESQL和输出参数_Sql_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

SP_EXECUTESQL和输出参数

SP_EXECUTESQL和输出参数,sql,sql-server,tsql,stored-procedures,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,但得到的是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参数总是空的?我看不出我的错误?

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

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
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的详细信息,如Deepak的答案,但更简单:

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


插入查询在哪里?如果要允许表名作为参数(这不是一个好主意),至少需要将参数包装在QUOTENAME中,以帮助防止sql注入。此外,使用不带order by的top不是一个好做法。您不知道将返回哪一行,并且它可以在执行之间更改。使用TOP时,您应该始终有一个order by。@Id=([Id])perfekt!但是,您的意思是什么:“您不是在变量中选择id,还应该在where子句中使用变量传递数据,以避免sql注入问题”@MeerArtefakt详细阐述了答案。