2016-10-05 7 views
0

私はSQL Server 2008を使用しています。複数の列に分割する文字列データを含むいくつかの列(A、B)を持つソーステーブルがあります。私は分割がすでに書かれている機能を持っています。単一の列を複数に分割してテーブルまたはビューにロード

ソーステーブルのデータ(ソーステーブル形式は変更できません)は、作成されたビューで使用されます。しかし、私のビューは、ソーステーブルから列AとBのデータを既に分割しておく必要があります。だから、私のビューは、ソーステーブルにない余分な列があります。

次に、ソーステーブルを使用して読み込まれたビューを使用して、他のテーブルとマージします。

あり二つの質問ここに:

  1. は、ビューを作成するときに、私は、ソース表から列AとBを分割することができますが、ソース表を変更しないでください?

  2. このタスクを実行するには、ビュー "選択"ステートメントで既存のユーザー定義関数を使用する方法はありますか?要するに

アイデア:

文字列分割するもコメントアウトセクションに一例が示されています。ほとんどの場合、Destinationテーブル、vStandardizedData View、Viewデータを使用してtblStandardDataテーブルにマージするSPがあります。ですから、私のSource列には、tblStandardDataテーブルにロードする前に分割する必要があるカラムAとBがあります。

私が働いている5つのオブジェクトがあります。

  1. ソースファイル
  2. 宛先表 (更新をマージし
  3. vStandardizedDataビュー
  4. tblStandardizedDataテーブル
  5. ストアドプロシージャは、と挿入)してvStandardizedData Viewを作成します。

注:5つのオブジェクトすべてが、作成されてロードされると想定される順序でリストされます。

:このから

別に私は分割する(列Bは、同じ形式のデータを有する)列A内の文字列の

例を使用するように言われた文字列を分割することができ、既存のUDFunctionあります

6667 Mission Street, 4567 7rd Street, 65 Sully Pond Park 

所望の結果:

enter image description here

U read this: How to create a Minimal, Complete, and Verifiable exampleにあり、

CREATE FUNCTION [Schema].[udfStringDelimeterfromTable] 
(
    @sInputList VARCHAR(MAX) -- List of delimited items 
    , @Delimiter CHAR(1) = ',' -- delimiter that separates items 
) 
RETURNS @List TABLE (Item VARCHAR(MAX)) WITH SCHEMABINDING 
/* 
* Returns a table of strings that have been split by a delimiter. 
* Similar to the Visual Basic (or VBA) SPLIT function. The 
* strings are trimmed before being returned. Null items are not 
* returned so if there are multiple separators between items, 
* only the non-null items are returned. 
* Space is not a valid delimiter. 
* 
* Example: 
SELECT * FROM [Schema].[udfStringDelimeterfromTable]('abcd,123, 456, efh,,hi', ',') 
* 
* Test: 
DECLARE @Count INT, @Delim CHAR(10), @Input VARCHAR(128) 
SELECT @Count = Count(*) 
    FROM [Schema].[udfStringDelimeterfromTable]('abcd,123, 456', ',') 
PRINT 'TEST 1 3 lines:' + CASE WHEN @Count=3 
       THEN 'Worked' ELSE 'ERROR' END 
SELECT @DELIM=CHAR(10) 
    , @INPUT = 'Line 1' + @delim + 'line 2' + @Delim 
SELECT @Count = Count(*) 
    FROM [Schema].[udfStringDelimeterfromTable](@Input, @Delim) 
PRINT 'TEST 2 LF :' + CASE WHEN @Count=2 
       THEN 'Worked' ELSE 'ERROR' END 
+0

あなたが十分な情報を提供していません。してくださいポステ1つ(または複数の、異なる構造であれば)文字列の例。ほとんどの文字列分割関数はレコードセットを返すので、各文字列部分に1つずつ多くの行が作成されます。新しい列*に並んでいる部品が必要な場合は、列見出しと値が必要なロジックが必要です。詳細を表示してください! – Shnugo

+0

いくつかのUDFコードを追加しました。分割する文字列は、コメントアウトされたセクションの例にも示されています。ほとんどの場合、Destinationテーブル、vStandardizedData View、Viewデータを使用してtblStandardDataテーブルにマージするSPがあります。ですから、私のSource列には、tblStandardDataテーブルにロードする前に分割する必要があるカラムAとBがあります。 – enigma6205

+0

申し訳ありませんが、私の頭で考えてみてください:私はあなたが何を必要としているか分かりません...このUDFは**テーブル**を返します。これはあなたがそれに参加しなければならないことを意味し、あなたは多くの行を得るでしょう。しかしあなたの質問では、複数の列に分割する*を読んでいます。区切られたデータは適切な構造になっていますか?あなたは1つの文字列内の部品の最大数を知っていますか?いくつかの実際のサンプル文字列と目的の出力を提供してください。 – Shnugo

答えて

1

は、私がお聞きしたいこと:SER定義関数は、テーブル変数を返します。

一般的に:あなたのUDFを使用する場合は、のテーブル形式のデータが得られます。あなたのUDFが実行中の番号とともに項目を返すのが最善でした。それ以外の場合は、最初にROW_NUMBER() OVER(...)を使用して、文字列連結を介してターゲット列名を作成するための部品番号を作成する必要があります。次にPIVOTを使用して列と並んでを取得します。自分の価値観は、(特に<,> and &を)禁じられた文字が含まれる可能性がある場合することができます

DECLARE @tbl TABLE(ID INT,YourValues VARCHAR(100)); 
INSERT INTO @tbl VALUES 
(1,'6667 Mission Street, 4567 7rd Street, 65 Sully Pond Park') 
,(2,'Other addr1, one more addr, and another one, and even one more'); 

WITH Casted AS 
(
    SELECT * 
      ,CAST('<x>' + REPLACE(YourValues,',','</x><x>') + '</x>' AS XML) AS AsXml 
    FROM @tbl 
) 
SELECT * 
     ,LTRIM(RTRIM(AsXml.value('/x[1]','nvarchar(max)'))) AS Address1 
     ,LTRIM(RTRIM(AsXml.value('/x[2]','nvarchar(max)'))) AS Address2 
     ,LTRIM(RTRIM(AsXml.value('/x[3]','nvarchar(max)'))) AS Address3 
     ,LTRIM(RTRIM(AsXml.value('/x[4]','nvarchar(max)'))) AS Address4 
     ,LTRIM(RTRIM(AsXml.value('/x[5]','nvarchar(max)'))) AS Address5 
FROM Casted 

より簡単なアプローチは、原則を示すために、in this answer

コンセプトの迅速な証明のようなXMLを介した文字列分割をすることができリンクされた答えでこれを処理するアプローチを見つけてください。

結果

+----+---------------------+-----------------+--------------------+-------------------+----------+ 
| ID | Address1   | Address2  | Address3   | Address4   | Address5 | 
+----+---------------------+-----------------+--------------------+-------------------+----------+ 
| 1 | 6667 Mission Street | 4567 7rd Street | 65 Sully Pond Park | NULL    | NULL  | 
+----+---------------------+-----------------+--------------------+-------------------+----------+ 
| 2 | Other addr1   | one more addr | and another one | and even one more | NULL  | 
+----+---------------------+-----------------+--------------------+-------------------+----------+ 
関連する問題