我打电话给一个存储过程,并在我的Windows应用程序中传入2个日期作为参数。它返回所有行,而不是我期待的2行。sp_executesql vs手动执行给出不同的结果
存储过程是:
ALTER procedure [dbo].[Get_Entries]
@Start_Date datetime=null,
@End_Date datetime=null
as
begin
SELECT *
FROM MyTable
WHERE (MyTable.Date BETWEEN @Start_Date AND @End_Date
OR (@Start_Date IS NULL AND @End_Date IS NULL))
ORDER BY MyTable.Date desc
end
以下sp_executesql
查询返回的所有行:如果我从Management Studio中手动运行存储过程
exec sp_executesql N'Get_Entries', N'@Start_Date datetime, @End_Date datetime',
@Start_Date='2015-06-06 11:35:06.437',
@End_Date='2015-07-06 11:35:06.437'
但是我得到预期的2行:
USE [MyDatabase]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[Get_Entries]
@Start_Date = N'2015-06-06 11:35:06.437',
@End_Date = N'2015-07-06 11:35:06.437'
SELECT 'Return Value' = @return_value
GO
任何想法为什么sp_executesql
isn' t返回过滤的列表?它返回所有行。
考虑使用动态SQL执行此任务,以避免次优的计划和参数嗅探。请参阅http://www.sommarskog.se/dyn-search.html。 –