2011-08-15 56 views
2

12344-23s2權值$ 4TSQL採取從每個逗號分隔值

我有從供給

12344-23s2$4, 12344-23s2$5, 12344-23s2$6, 12344-23s2$7 

所有上述值由逗號分隔接收的值。

對於每一個逗號分隔值我需要只有右邊部分是後 - (連字符)

我試着用下面的語句

right(ID, len(ID) - CHARINDEX('-', ID)) 

如果我只有一個值,我得到的正確的值。即23s2 $ 4。 但如果我有多個逗號分隔值,我會在第一次後得到所有的值。

我想利用每一個逗號分隔值和每個值我想只取右部(連字符後)

+1

如何導入呢?第一位總是「12344」? – gbn

回答

1

你是需要在存儲過程中執行此操作。在存儲過程中,您必須創建一個while循環並遍歷字段,直到處理完所有逗號。

+0

無需循環:值可以很簡單地拆分 – gbn

1

所以,你已經解決了單個值的問題 - 這是一個很好的一步。現在,列出單個值。一種方法是把它變成一張桌子。下面是我使用的功能,即把一個逗號分隔的字符串到表:

CREATE Function [dbo].[ParseStringList] (@StringArray nvarchar(max)) 
Returns @tbl_string Table (ParsedString nvarchar(max)) As 

BEGIN 

DECLARE @end Int, 
     @start Int 

SET @stringArray = @StringArray + ',' 
SET @start=1 
SET @end=1 

WHILE @end<Len(@StringArray) 
    BEGIN 
     SET @end = CharIndex(',', @StringArray, @end) 
     INSERT INTO @tbl_string 
      SELECT 
       Substring(@StringArray, @start, @[email protected]) 

     SET @[email protected]+1 
     SET @end = @end+1 
    END 

RETURN 
END 

然後你從表中選擇這樣的:

Select ParsedString From dbo.ParseStringList(@StringArray) 

所以從這裏,你可以申請您的解決方案:

Select right(ParsedString, len(ParsedString) - CHARINDEX('-', ParsedString)) 
From dbo.ParseStringList(@StringArray) 
+0

非常感謝..它工作正常.. – srikanth

1

如果使用SQLBulkCopy,BULK INSERT或bcp導入它,則可以在導入時將CSV拆分爲單獨的列。然後你的SQL按列工作。

如果你不能做到這一點,然後拆分(看看這裏如何:Split function equivalent in T-SQL?)值的行。

現在你已經分居了CSV(如行或列)使用上述

  • 要麼

    • 您的權利代碼,如果領先的值始終是12344,然後用REPLACE (MyValue, '12344-', '')
  • 1

    通常當你嘗試做這樣的事情時,你必須創建一個UDF,允許你根據分隔符分割一個字符串。本文將詳細說明一個相當不錯的一個:

    http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx

    You can also看看使用一些XML函數來做到這一點:

    Declare @xml as xml,@str as varchar(100),@delimiter as varchar(10) 
    SET @str='12344-23s2$4, 12344-23s2$5, 12344-23s2$6, 12344-23s2$7' 
    SET @delimiter =',' 
    SET @xml = cast(('<X>'+replace(@str,@delimiter ,'</X><X>')+'</X>') as xml) 
    SELECT right(N.value('.', 'varchar(16)'), len(N.value('.', 'varchar(16)')) - CHARINDEX('-', N.value('.', 'varchar(16)'))) as value FROM @xml.nodes('X') as T(N)