2013-10-02 2 views
0

J'ai ID en tant que varchar. Je dois diviser en virgule après que j'ai besoin de convertir la liste en int32. J'ai ajouté un exemple comme ci-dessous.Ms Sql Split et Convert

DECLARE @List varchar(255) 

SET @List = '1, 2, 3, 4, 5, 6' 

print @List 

Répondre

0

Vous pouvez essayer quelque chose comme:

DECLARE @List varchar(255) = '1, 2, 23, 4, 5, 6' 

DECLARE @X XML 
SELECT @X = '<myxml><nodes><n>' + 
       REPLACE(@List,',','</n></nodes><nodes><n>') + 
      '</n></nodes></myxml>' 

--SELECT @X 

SELECT LTRIM(C.value('n[1]','VARCHAR(50)')) AS item1 
FROM @X.nodes('/myxml/nodes') Cols (C) 

Fiddle demo

Résultats:

| ITEM1 | 
--------|-- 
|  1 | 
|  2 | 
| 23 | 
|  4 | 
|  5 | 
|  6 | 

Remarque: si vous avez des espaces entre les numéros selon vos données d'échantillon (2 3), vous pouvez utiliser Replace() fonction de les supprimer avant de convertir en INT. IsNumeric() fonction peut également être utile (s'il vous plaît lire la section note de la fonction isnumeric() pour plus de détails).

0

I sont adaptés à partir d'un script p.s.w.g's answer qui divise une chaîne en un tableau de mémoire int:

CREATE FUNCTION [dbo].[SplitToIntList] 
    (@string nvarchar(4000) 
    , @delim nvarchar(100)) 
RETURNS 
    @result TABLE ([Value] int NULL) 
AS 
BEGIN 
    DECLARE @str nvarchar(4000) 
      , @pos int 
      , @prv int = 1 

    SELECT @pos = CHARINDEX(@delim, @string) 
    WHILE @pos > 0 
    BEGIN 
     SELECT @str = SUBSTRING(@string, @prv, @pos - @prv) 
     INSERT INTO @result SELECT CAST(@str AS INT) 

     SELECT @prv = @pos + LEN(@delim) 
      , @pos = CHARINDEX(@delim, @string, @pos + 1) 
    END 

    INSERT INTO @result SELECT CAST(SUBSTRING(@string, @prv, 4000) AS INT) 
    RETURN 
END 

HTH