1

我的拆分功能是

ALTER FUNCTION [dbo].[SplitString](@String varchar(8000), @String2 varchar(8000),      @String3 varchar(8000))
returns @temptable TABLE (items varchar(8000), items2 varchar(8000), items3 datetime)
as
begin
declare @idx int
declare @slice varchar(8000)
declare @idx2 int
declare @slice2 varchar(8000)
declare @idx3 int
declare @slice3 varchar(8000)
declare @Delimiter char(1) = ','

select @idx = 1
    if len(@String)<1 or @String is null  return

select @idx2 = 1
    if len(@String)<1 or @String is null  return

select @idx3 = 1
    if len(@String)<1 or @String is null  return

while @idx!= 0 AND @idx2!= 0 AND @idx3!= 0
begin
    set @idx = charindex(@Delimiter,@String)
    if @idx!=0
        set @slice = left(@String,@idx - 1)
    else
        set @slice = @String

    set @idx2 = charindex(@Delimiter,@String2)
    if @idx2!=0
        set @slice2 = left(@String2,@idx2 - 1)
    else
        set @slice2 = @String2

    set @idx3 = charindex(@Delimiter,@String3)
    if @idx3!=0
        set @slice3 = left(@String3,@idx3 - 1)
    else
        set @slice3 = @String3

    if(len(@slice)>0 AND len(@slice2)>0 AND len(@slice3)>0)
        insert into @temptable(Items,items2,items3) values(@slice, @slice2, (SELECT REPLACE(CONVERT(VARCHAR, CAST(@slice3 AS DATETIME), 106), ' ', '-') ))

    set @String = right(@String,len(@String) - @idx)
    set @String2 = right(@String2,len(@String2) - @idx2)
    set @String3 = right(@String3,len(@String3) - @idx3)
    if (len(@String) = 0 AND len(@String2) = 0 AND len(@String3) = 0) break


end
return
end

它接受 3 个输入 2varchar和 1 datetime。当我用这个测试这个功能时

select * From dbo.SplitString
(
 'Comments1,Comments2,Comments3,',
 'UserName1,UserName2,UserName3,', 
 '1/1/2013 12:00:00 AM,2/2/2013 12:00:00 AM,3/3/2013 12:00:00 AM,'
)

我得到了正确的价值观

Comments1       UserName1       2013-01-01 00:00:00.000
Comments2       UserName2       2013-02-02 00:00:00.000
Comments3       UserName3       2013-03-03 00:00:00.000

现在我用它来插入

    SELECT @ID = SCOPE_IDENTITY()
    DECLARE @Comments = 'Comments1,Comments2,Comments3,'
    DECLARE @UserName = 'UserName1,UserName2,UserName3,', 
    DECLARE @EntryDate = '1/1/2013 12:00:00 AM,2/2/2013 12:00:00 AM,3/3/2013 12:00:00 AM,'

    INSERT INTO dbo.EventActivationComments
    (
        EventID,
        Comments,
        UserName,
        EntryDate
    )
    (
        SELECT @ID, * FROM dbo.SplitString(@Comments,@UserName,@EntryDate)
    )

但我在插入时遇到错误

消息 8114,级别 16,状态 5,过程 InsertNewEvent,第 0 行将
数据类型 varchar 转换为日期时间时出错。

谁能帮我解决这个问题?

谢谢

4

1 回答 1

0

各种设置(语言、日期格式)仅影响输入中的字符串DateTime在 SQL Server 中的解释方式。

SQL Server 支持多种格式 - 请参阅有关 CAST 和 CONVERT 的 MSDN 联机丛书。这些格式中的大多数取决于您拥有的设置 - 因此,这些设置有时可能有效 - 有时无效。

解决此问题的方法是使用 SQL Server 支持的(稍作调整的)ISO-8601 日期格式- 这种格式始终有效- 无论您的 SQL Server 语言和日期格式设置如何。

SQL Server 支持的ISO-8601 格式有两种形式:

  • YYYYMMDD仅适用于日期(无时间部分);注意这里:没有破折号!,这很重要!YYYY-MM-DD不独立于 SQL Server 中的日期格式设置,并且不会所有情况下工作!

或者:

  • YYYY-MM-DDTHH:MM:SS对于日期和时间 - 请注意:这种格式破折号(但可以省略),并且T在您的DATETIME.

这对 SQL Server 2000 和更新版本有效。

如果您使用 SQL Server 2008 或更新版本以及DATE数据类型(仅DATE-不是 DATETIME!),那么您确实也可以使用该YYYY-MM-DD格式,并且该格式也适用于您的 SQL Server 中的任何设置。

不要问我为什么整个话题如此棘手和令人困惑——事情就是这样。但是使用该YYYYMMDD格式,您应该适用于任何版本的 SQL Server 以及 SQL Server 中的任何语言和日期格式设置。

于 2013-06-04T16:05:48.483 回答