2013-06-05 56 views
0

如何使用分隔符('。')將未知長度的字符串解析到不同的列中。如何在SQL Server 2012中解析未知長度的字符串2012

declare osversion varchar(100) 
set osversion = '6.2.9295' 
SELECT [Part1] = LEFT(osversion,CHARINDEX('.',osversion) - 1), 
    [Part2] = SUBSTRING(osversion,CHARINDEX('.',osversion) + 1, 
         CHARINDEX('.',osversion,CHARINDEX('.', 
         osversion) + 1) - (CHARINDEX('.',osversion) + 1)), 
    [Part3] = SUBSTRING(osversion,CHARINDEX('.', 
         osversion,CHARINDEX('.',osversion) + 1) + 1, 
         DATALENGTH(osversion) - CHARINDEX('.', 
         osversion,CHARINDEX('.',osversion) + 1) - 
         CHARINDEX('.',REVERSE(osversion))), 
     from table1 

結果:

Part1 Part2 Part3 
6 2 9295 

該結果對於串的固定長度。我想解析未知長度的字符串。 Like '86 .52.929.695.22.1234'。請幫忙。

+0

[在SQL分割字符串(HTTP的可能重複:// stackoverflow.com/questions/2647/split-string-in-sql) –

回答

0

我的目的是在SQL中重新創建C#的string.Split函數。下面是代碼

CREATE FUNCTION [dbo].[f_Split](
@String NVARCHAR (4000), 
@Delimiter NVARCHAR (10) 
) 

RETURNS @T TABLE ([Value] NVARCHAR(4000)) 
BEGIN 
    DECLARE @NEXTSTRING NVARCHAR(4000) 
    DECLARE @POS INT,@DELIM_SIZE INT 
    DECLARE @NEXTPOS INT 
SELECT 
    @NEXTSTRING = '', 
    @String = @String + @Delimiter, 
    @DELIM_SIZE = LEN(@Delimiter) 

SET @POS = CHARINDEX(@Delimiter,@String) 
SET @NEXTPOS = 1 

WHILE (@POS <> 0) 
BEGIN 
    SET @NEXTSTRING = SUBSTRING(@String,1,@POS - 1) 
    INSERT INTO @T ([VALUE]) VALUES (@NEXTSTRING) 
    SET @String = SUBSTRING(@String,@POS [email protected]_SIZE,LEN(@String)) 
    SET @NEXTPOS = @POS 
    SET @POS = CHARINDEX(@Delimiter,@String) 
END 

RETURN 

END 

可以調用像

DECLARE @temp nvarchar(255); SELECT @temp = '86.52.929.695.22.1234'; 
SELECT * FROM dbo.f_Split(@temp,'.'); 

這裏的函數輸出:

Value 
86 
52 
929 
695 
22 
1234 
+0

感謝您的快速回復。但我需要將輸出分成不在1行的列。 Like Value1 value2 value3 value4 value5 value6。 – user2454617

+0

對不起,沒有在1行中的一列。所以輸出應該在不同的列中。 – user2454617

+0

好吧,我明白你想要做什麼:在列中有行。爲此,您應該遵循此鏈接[sql-server-pivot-dynamic-columns-no-aggregation](http://stackoverflow.com/questions/11985796/sql-server-pivot-dynamic-columns-no-aggregation) – PascalT