gpt4 book ai didi

sql - sp_executesql 与手动执行给出不同的结果

转载 作者:行者123 更新时间:2023-12-02 21:15:04 27 4
gpt4 key购买 nike

我正在调用一个存储过程并从我的 Windows 应用程序中传入 2 个日期作为参数。它返回所有行而不是我期望的 2 行。

存储过程是:

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 查询返回所有行:

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'

但是,如果我从 Management Studio 手动运行存储过程,我会得到预期的 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不返回过滤列表吗?它返回所有行。

最佳答案

解决此问题的方法是使用 SQL Server 支持的(稍作修改的)ISO-8601 日期格式 - 此格式始终有效 - 无论您的情况如何SQL Server 语言和日期格式设置。

ISO-8601 format SQL Server 支持两种类型:

  • YYYYMMDD 仅表示日期(无时间部分);请注意:不要破折号!,这非常重要! YYYY-MM-DD 独立于 SQL Server 中的日期格式设置,并且在所有情况下都有效!

或者:

  • YYYY-MM-DDTHH:MM:SS 用于日期和时间 - 请注意:此格式破折号(但它们可以是省略),以及固定的 T 作为 DATETIME 的日期和时间部分之间的分隔符。

这对于 SQL Server 2000 及更高版本有效。

如果您使用 SQL Server 2008 或更高版本以及 DATE 数据类型(仅限 DATE - DATETIME! ),那么您确实也可以使用 YYYY-MM-DD 格式,并且该格式也适用于 SQL Server 中的任何设置。

不要问我为什么整个主题如此棘手且有些令人困惑 - 事情就是这样。但使用 YYYYMMDD 格式,您应该可以适用于任何版本的 SQL Server 以及 SQL Server 中的任何语言和日期格式设置。

我对 SQL Server 2008 及更高版本的建议是,如果您只需要日期部分,则使用 DATE;如果您同时需要日期和时间,则使用 DATETIME2(n)。如果可能的话,您应该尝试开始逐步淘汰 DATETIME 数据类型

关于sql - sp_executesql 与手动执行给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31244206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com