2016-10-05 28 views
0

我正在使用SQL Server 2008.我有一個包含字符串數據的幾列(A,B)的源表,以便將其拆分爲多個列。我確實有這樣的功能,就是已經寫好的分割。將單列拆分爲多個並將其加載到表或視圖

源表中的數據(源表格式無法修改)用於創建的視圖中。但我需要讓我的視圖已經從源表中爲列A和B分割數據。所以,我的視圖將有額外的列不在源表中。

然後,使用源表填充的視圖用於與其他表合併。

有兩種問題在這裏:

  1. 我可以創建一個視圖時,但不更改源表源表拆分列A和B?

  2. 如何在視圖「選擇」語句中使用我現有的用戶定義函數來完成此任務?

Idea在短:

字符串分割也被示出在註釋部分的示例。幾乎有目標表,vStandardizedData視圖,SP使用視圖數據合併到tblStandardizedData表。所以,在我的Source列中,我需要在加載到tblStandardizedData表之前拆分A和B列。

有跡象表明,我的工作五保對象:

  1. 源文件
  2. 目標表
  3. vStandardizedData查看
  4. tblStandardizedData表
  5. 存儲過程,它合併 (更新和插入)形成vStandardizedData視圖。

注意:所有5個對象都按照它們應該創建和加載的順序列出。

與此獨立地存在現有UDFunction可拆分其中我被告知在列A使用的字符串的

實施例(B欄具有相同的格式的數據)要拆分的字符串:

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

期望的結果:

enter image description here

ù ser-defined函數返回一個表變量:

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

你沒有提供足夠的信息:請郵政一個(或幾個,如果不同的結構),字符串的例子。大多數字符串分割函數將返回一個記錄集,因此每個字符串部分導致多行一個。如果您需要新欄目中的部件*並排*,您需要列標題和一些邏輯值哪裏去...請顯示更多詳細信息! – Shnugo

+0

只需添加一些UDF代碼。要註釋的字符串也顯示在註釋掉的部分的示例中。幾乎有目標表,vStandardizedData視圖,SP使用視圖數據合併到tblStandardizedData表。所以,在我的Source列中,我需要在加載到tblStandardizedData表之前拆分A和B列。 – enigma6205

+0

對不起,試着用腦子想:我不知道你需要什麼......這個UDF將返回一個**表**。這意味着你必須加入它,你會得到很多行。但在你的問題,我讀*分裂成多個列*。劃分的數據是否體面結構?你知道一個字符串內部件的最大數量嗎?請提供一些實際的樣本字符串和所需的輸出。 – Shnugo

回答

1

我想問你的是read this: How to create a Minimal, Complete, and Verifiable example

一般來說:如果你使用你的UDF,你會得到表中的數據。如果您的UDF會將該項目與運行號碼一起返回,那最好。否則,您首先需要使用ROW_NUMBER() OVER(...)創建零件編號,以便通過字符串連接創建目標列名稱。然後使用PIVOT並列並列

一種更簡單的方法也能像in this answer

概念的快速證明,以通過XML字符串分割顯示的原則:

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 

如果你的價值觀可能包括禁止文字(特別是<,> and &),你可以在鏈接的答案中找到解決這個問題的方法。

結果

+----+---------------------+-----------------+--------------------+-------------------+----------+ 
| 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  | 
+----+---------------------+-----------------+--------------------+-------------------+----------+