2013-10-02 90 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