我的分割功能是
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时出错。
有人可以帮我解决这个问题吗?
由于
答案 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中的任何语言和日期格式设置。