我有以下过程:
ALTER PROCEDURE [dbo].[myProcedute]
@mydate VARCHAR(8000) = NULL
IF @mydate = ''
BEGIN
SET @mydate = NULL
END
ELSE
BEGIN
SET @mydate = CONVERT(DATETIME, @mydate, 103) -- dd/mm/yy
END
INSERT INTO dbo.myTable(theDate) VALUES(@mydate)
我像这样执行它:
EXEC [dbo].[myProcedure] '02/02/2012'
执行后出现此错误:从字符串转换日期时间时转换失败。
我从我的 vb6 代码执行它,日期可能会有所不同。这次是"02/02/2012",但下次可能是"(空)。
当它作为"出现时,我需要它插入一个 NULL,正如您在 IF 子句中看到的那样。
为什么我会收到此错误?
多谢!
使用 ISDATE() 检查它是否是有效的日期。
转换似乎很好。正如评论所暗示的那样,如果您可以将参数更改为DATE
,这将解决很多
ALTER PROCEDURE [dbo].[myProcedute]
@mydate VARCHAR(8000) = NULL
IF ISDATE(@mydate)
BEGIN
SET @mydate = CONVERT(DATETIME, @mydate, 103) -- dd/mm/yy
END
ELSE
BEGIN
SET @mydate = NULL
END
INSERT INTO dbo.myTable(theDate) VALUES(@mydate)
最好将日期字符串格式化为ISO格式(yyyymmdd
),这保证可以在任何sql服务器上工作。假设您的 vb 代码像dd/mm/yyyy
一样传递它(根据您的数据)。试试这个;
--Format @mydate to yyyymmdd
SELECT @mydate = CASE LEN(@mydate) WHEN 10
THEN RIGHT(@mydate,4)+ SUBSTRING(@mydate,4,2)+ LEFT(@mydate,2)
ELSE NULL END
--Insert
INSERT INTO dbo.myTable(theDate) VALUES(@mydate)