SQL:插入日期时从字符串转换日期时间

SQL:插入日期时从字符串转换日期时间,sql,datetime,stored-procedures,type-conversion,Sql,Datetime,Stored Procedures,Type Conversion,我有以下程序: 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

我有以下程序:

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代码执行它,日期可能会有所不同。这次是 “2012年2月2日”,但下次可能是“”(空)

当它是“”时,我需要它插入一个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格式(
yyyyymmdd
),这样可以保证在任何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)

为什么不将定义
@mydate
更改为
DATE
?如果LTRIM(@mydate)=“我建议将其作为
datetime
传递,则可以避免很多问题。@Luv-VB6表示ADO classic,我认为它从未针对2008类型进行过更新。