2011-08-15 14 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

を使用し、CSVを分離していますストアドプロシージャ内でこれを行う必要があります。ストアドプロシージャでは、すべてのコンマを処理するまで、whileループを作成してフィールドをループする必要があります。

+0

ループする必要はありません:値は非常に簡単に分割することができます – gbn

1

(ハイフンの後)のみ右の部分を取りたい - それは良いステップです。今、単一の値のリストを作成します。 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?)。 (行または列として)

  • 上のいずれか

    • あなたRIGHTコードを使用する大手値は常に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)