2013-10-02 54 views
0

我有ID作为varchar。我需要分割为逗号后,我需要将列表转换为int32。我添加了如下例子。Ms Sql拆分和转换

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