0

我有以下程序:

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 子句中看到的那样。

为什么我会收到此错误?

非常感谢 !

4

2 回答 2

1

使用 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)
于 2013-01-25T09:58:27.077 回答
0

最好将您的日期字符串格式化为ISO 格式( yyyymmdd),这样可以保证在任何 sql-server 上工作。假设您像 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)
于 2013-01-25T10:05:54.717 回答