动态查询返回参数给出了困难时间

时间:2013-09-12 20:34:44

标签: sql-server-2008 tsql

我有以下SQL:

DECLARE @SQL NVARCHAR(500)
DECLARE @Count INT

SET @SQL = 'SELECT @Count = COUNT(*) FROM customers WHERE lastname = ''alex'''

print @sql
EXECUTE sp_executesql @SQL, N'@Count int OUTPUT'
SELECT @Count

当我运行它时,我得到以下错误。知道我做错了吗?

  

Msg 8178,Level 16,State 1,Line 1
  参数化查询'(@Count int OUTPUT)SELECT @Count = COUNT(*)FROM customers WHERE'需要参数'@Count',这是未提供的。

1 个答案:

答案 0 :(得分:3)

您错过了提供@Count参数作为sp_executesql电话的一部分(请注意,在这种情况下,它也应标记为OUTPUT):

...

EXECUTE sp_executesql @SQL, N'@Count int OUTPUT', @Count OUTPUT
SELECT @Count

sp_executesql调用中的第二个参数是查询参数定义,或者所谓的形式参数(在您的情况下,有单个参数N'@Count int OUTPUT')。如果查询是参数化的,那么应该追求的是(第三个和后续参数)所谓的实际参数

以下样本可能会更好地解释:

-- sample query #1
-- will fail, because of query is pararmeterized,
-- and actual pararmeter is not provided
EXEC sp_executesql N'SELECT @Num', N'@Num int';

-- sample query #2
-- formal parameter is @Num of type int
-- actual parameter is literal constant 153
EXEC sp_executesql N'SELECT @Num', N'@Num int', 153;

-- sample query #3
-- formal parameter is @Num of type int
-- actual parameter is variable @p
DECLARE @p int;
SET @p = 1;
EXEC sp_executesql N'SELECT @Num', N'@Num int', @p;

-- sample query #4
DECLARE @p int;
SET @p = 15;
EXEC sp_executesql N'SELECT @Num=@Num*2', N'@Num int output', @p output
select @p;