我有一个小的存储过程(SQl Server 2012)。
如果我使用以下方式运行它:
exec spSelRegion @bOver21 = 1
我得到的结果不同于使用以下方式运行:
exec sp_executesql N'spSelRegion',N'@bOver21 bit',@bOver21=1
有什么区别?
ALTER PROCEDURE [dbo].[spSelRegion]
(
@ID int = NULL
,@Name varchar(128) = NULL
,@OrderBy varchar(16) = 'ID'
,@bOver21 bit = null
)
AS
SELECT distinct
r.[ID],
r.[Name],
r.[dInserted],
r.[sInserted],
r.[dUpdated],
r.[sUpdated],
r.[timestamp]
FROM
[dbo].[tblRegion] r
left outer join tblCountyRegion cr
on r.ID = cr.RegionNbr
WHERE
(r.[ID] = @ID or @ID is null)
AND (r.[Name] = @Name or @Name is null)
AND (@bOver21 is null and r.[ID] >20
OR (@bOver21 = 1 and r.[ID] > 20 and cr.IsActive=1)
OR (@bOver21 = 0 and r.[ID] >= 21 and r.id < 31))
我不想让它比现在更加复杂。但是在今天的微软更新之后,一些存储过程现在使用sp_executesql而不是Exec运行,这就是问题的根源。
答案 0 :(得分:5)
您需要使用指定的参数运行动态SQL。没有它,它假定传递了空值。所以这个:
exec sp_executesql N'spSelRegion @bOver21 = @bOver21',N'@bOver21 bit',@bOver21=1