我有以下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',这是未提供的。
答案 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;