我正在尝试在我的工作中调试旧的VB6
程序。它充满了错误和硬编码的东西。
程序正在连接SQL Server 2005数据库,以使用存储过程读取和写入信息。
由于该程序在我正在使用时仍在使用,因此我对数据库进行了备份以测试某些内容并在我的SQL Server 2008版本中进行了恢复。一切正常。
当我第二天早上来的时候,我得到了一个错误,即使晚上没有使用该程序,我前一天晚上也没有。
问题:
"exec dbo.sp_Get_Wait_Data '" & DateEx & "'"
DateEx
是一个包含"2012/06/14"
存储过程:
[sp_Get_Wait_Data] @Datest as char(10)
AS
SELECT
(A lot of column names here)
FROM
Fiche
LEFT JOIN
voyage ON fcid = vofiche
LEFT JOIN
client on fcaccount = cusnov
WHERE
fcdate = @Datest
AND (void is null or (void > 0 and (void <> 999 and void <> 1000 and void <> 998)))
AND ((fcremarques NOT LIKE '%SYSANNULATION%' OR
fcremarques IS NULL)
AND fcrettime IS NOT NULL)
ORDER BY
FcTime, FcOrgSite, fcdessite
错误消息:
将varchar数据类型转换为smalldatetime数据类型导致超出范围的值
因此,存储过程中的错误是fcdate=@Datest
。我尝试在存储过程中添加此行
SELECT convert(datetime, @Datest, 120)
在查询中像转换的魅力一样工作,但当其他查询尝试访问此变量时,在程序中导致了几百个其他错误,因此它不是一个选项。
任何想法为什么这个查询昨天工作得很好,现在它给了我这个错误?提前谢谢。
答案 0 :(得分:4)
连接到数据库副本时,您可能有set dateformat dmy。日期格式由使用的语言隐式设置。 set language
您可以将参数的格式更改为YYYYMMDD
,无论set dateformat
如何都是安全的,甚至更好,将参数更改为datetime
。
如果这不是一个选项,您可以使用where fcdate=convert(datetime, @Datest, 111)