2013-06-04 5 views
1

Ma fonction split estInsérer avec csv dans le tableau

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 

prend en 3 deux entrées varchar et un datetime. Lorsque je teste cette fonction avec cette

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,' 
) 

Je reçois des valeurs propres

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 

Maintenant, je suis en utilisant cette méthode pour insérer

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) 
    ) 

Mais je reçois une erreur sur insert

Msg 8114, niveau 16, état 5, procédure InsertNewEvent, L ine 0
Erreur lors de la conversion du type de données varchar en datetime.

Quelqu'un peut-il s'il vous plaît aidez-moi avec ça?

Merci

Répondre

0

Les différents paramètres (langue, format de date) n'influencent la façon dont une chaîne dans votre entrée est interprétée comme DateTime dans SQL Server.

Il existe de nombreux formats pris en charge par SQL Server - voir le MSDN Books Online on CAST and CONVERT. La plupart de ces formats sont dépendants sur quels paramètres vous avez - par conséquent, ces paramètres peuvent fonctionner à certains moments - et parfois non.

La façon de résoudre ce problème est d'utiliser le (légèrement adapté) format de date ISO-8601 qui est pris en charge par SQL Server - ce format fonctionne toujours - quelle que soit votre langue SQL Server et les paramètres dateformat.

Le ISO-8601 format est pris en charge par SQL Server est disponible en deux saveurs:

  • YYYYMMDD pour connaître les dates juste (pas partie de temps); notez ici: pas de tirets!, c'est très important! YYYY-MM-DD est pas indépendant des paramètres de dateformat dans votre SQL Server et pas fonctionner dans toutes les situations!

ou:

  • YYYY-MM-DDTHH:MM:SS pour les dates et heures - noter ici: ce format a des tirets (mais ils peut être omis), et un T fixe comme séparateur entre la date et l'heure partie de votre DATETIME.

Ceci est valide pour SQL Server 2000 et plus récent.

Si vous utilisez SQL Server 2008 ou plus récent et le DATE type de données (seulement DATE - pasDATETIME), alors vous pouvez en effet utiliser également le format YYYY-MM-DD et qui fonctionnera aussi avec les paramètres dans votre SQL Server . Ne me demandez pas pourquoi tout ce sujet est si compliqué et plutôt confus - c'est comme ça. Mais avec le format YYYYMMDD, vous devriez vous débrouiller pour n'importe quelle version de SQL Server et pour n'importe quel paramètre de langage et de format de date dans votre SQL Server.

+0

Merci pour la réponse. Je suis vraiment très confus maintenant. Je suis développeur et mon travail a été très limité du côté de la base de données. Pourrait être un peu plus précis sur ce que j'ai besoin de changer – DotNetBeginner

+2

Vous devez changer le format de vos chaînes de date pour correspondre à un format de date approprié. Le champ datetime ne peut pas les accepter tels qu'ils sont. –

+0

voulez-vous dire changer cette ligne pour correspondre au format de date approprié (SELECT REPLACE (CONVERT (VARCHAR, CAST (@ slice3 AS DATETIME), 106), '', '-') – DotNetBeginner