我想从查询中获取 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 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
这里的详细信息
喜欢Deepak的答案,但更简单:
执行 SP_EXECUTESQL @SqlQuery,
N'@Id INT 输出,@IdModul INT',
@IdModul 输出,@Id
这是一个返回动态定义的过程的返回值(而不是选择表结果)的示例:
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
(用例:为了进行完整的“数据运行”,我将光标浏览要执行的过程列表,每个过程都会返回一个行数以用于记录目的。在破解这个问题之前我已经追了很久了。)