SP_EXECUTESQL和输出参数
我想从查询中获取ID,但得到的是NULL,我的错误在哪里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,
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详细阐述了答案。