在表中插入csv

时间:2013-06-04 16:03:17

标签: sql sql-server sql-server-2008

我的分割功能是

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个输入两个varchar和一个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)
    )

但是我在插入

时遇到错误
  

Msg 8114,Level 16,State 5,Procedure InsertNewEvent,Line 0
  将数据类型varchar转换为datetime时出错。

有人可以帮我解决这个问题吗?

由于

1 个答案:

答案 0 :(得分:0)

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

SQL Server支持多种格式 - 请参阅MSDN Books Online on CAST and CONVERT。大多数格式都是依赖你所拥有的设置 - 因此,这些设置可能会有效 - 有时也不会。

解决此问题的方法是使用SQL Server支持的(略微调整的) ISO-8601日期格式 - 此格式始终 - 无论您的是什么SQL Server语言和日期格式设置。

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

  • YYYYMMDD仅适用于日期(无时间部分);请注意:没有破折号!,这非常重要! YYYY-MM-DD 独立于SQL Server中的dateformat设置, NOT 可以在所有情况下使用!

或:

  • 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中的任何语言和日期格式设置。