2013-10-02 3 views
0

У меня есть ID как varchar. Мне нужно разделить как Comma после того, как мне нужно преобразовать список в int32. Я добавил пример, как показано ниже.Ms Sql Split and Convert

DECLARE @List varchar(255) 

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

print @List 

ответ

0

Вы можете попробовать что-то вроде:

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

Результаты:

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

Примечание: если у вас есть пробелы между числами в соответствии с вашими данными выборки (2 3), вы можете использовать Replace(), чтобы удалить их перед преобразованием в INT. IsNumeric() также может быть полезна (подробнее см. Раздел примечания функции isnumeric()).

0

Я адаптировал сценарий из p.s.w.g's answer, которые расщепляются строкой в ​​таблице в памяти 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