Sql server 在T-SQL转换函数上指定样式会导致错误

Sql server 在T-SQL转换函数上指定样式会导致错误,sql-server,tsql,Sql Server,Tsql,我有一个存储过程,它接收各种格式的日期并将其转换为日期时间。以下线路与预期一样工作: RETURN CONVERT(datetime,@vMonth+'/'+@vDay+'/'+@vYear) 但是,我想指定日期应始终被视为US格式,因为如果T-SQL设置为使用英制,这将返回错误的结果。如果我这样做: RETURN CONVERT(datetime,@vMonth+'/'+@vDay+'/'+@vYear, 101) 然后我开始得到以下错误(在我尝试过的所有值上): 我做了一个搜索,没有一个

我有一个存储过程,它接收各种格式的日期并将其转换为日期时间。以下线路与预期一样工作:

RETURN CONVERT(datetime,@vMonth+'/'+@vDay+'/'+@vYear)
但是,我想指定日期应始终被视为US格式,因为如果T-SQL设置为使用英制,这将返回错误的结果。如果我这样做:

RETURN CONVERT(datetime,@vMonth+'/'+@vDay+'/'+@vYear, 101)
然后我开始得到以下错误(在我尝试过的所有值上):

我做了一个搜索,没有一个线程提到这个错误似乎是相同的问题。我不明白为什么为已经转换为us_english的字符串指定us_english(101)会导致过程中断

编辑:我已经把这归结为一个最低限度的案例,表明我不理解的地方

这项工作:

select CONVERT(datetime,'01/02/03')
这并不是:

select CONVERT(datetime,'01/02/03',101)

这对我来说很好。没有错误

declare @mydate datetime = getdate()

declare @vMonth varchar(10), @vDay varchar(10), @vYear varchar(10)

set @vMonth = cast(DATEPART(mm, @mydate) as varchar(10))
set @vDay = cast(DATEPART(dd, @mydate) as varchar(10))
set @vYear = cast(DATEPART(YYYY, @mydate) as varchar(10))

select CONVERT(datetime, @vMonth+'/'+@vDay+'/'+@vYear, 101)
结果:

2015-01-09 00:00:00.000

事实证明,当使用101作为语言时,SQLServer希望世纪采用XXXX格式。要正确处理两位数年份,您必须使用1作为语言。

您能提供示例输入和参数的数据类型吗?
选择convert(datetime,'01'+'/'+'09'+'/'+'2015',101)
对我来说很好。我怀疑问题出在
convert()
函数本身。然而,我不相信你的功能会达到你的目的。如果返回
datetime
,函数值可能不会记住使用的区域性,因为当转换为
datetime
时,第三个参数仅控制输入格式。它希望通过
SELECT
查询完成输出格式。您需要告诉我们您是如何填充
@vMonth
@vDay
,等等的。很明显,
@vMonth
以某种方式获得了>12或
@vDay
某物>31(或2月的>28/29,等等)或者比这更糟糕的事情(比如
@vYear
是9237823273239)。但如果我们只能看到你的皈依,我们就无法告诉你这是怎么发生的或为什么发生的;Aaron:不幸的是,我不能发布完整的代码,但是我验证了如果我使用输入“1,2,3”运行,那么当它到达convert语句时,变量的值(都是varchar(255)s)是1、2和3。
2015-01-09 00:00:00.000