【问题标题】:Split Single Column into multiple and Load it to a Table or a View将单个列拆分为多个并将其加载到表或视图中
【发布时间】:2016-10-05 20:51:45
【问题描述】:

我使用的是 SQL Server 2008。我有一个包含几列(A、B)的源表,其中包含要拆分为多列的字符串数据。我确实有已经写好的拆分功能。

源表中的数据(源表格式不能修改)用于正在创建的视图中。但我需要让我的视图已经从源表中拆分列 A 和 B 的数据。因此,我的视图将包含 Source 表中没有的额外列。

然后使用 Source 表填充的 View 与 Other Table 合并。

这里有两个问题:

  1. 我可以在创建视图时从源表中拆分列 A 和 B,但不更改源表吗?

  2. 如何在视图“选择”语句中使用我现有的用户定义函数来完成这项任务?

简而言之:

要拆分的字符串也显示在注释掉部分的示例中。几乎有 Destination 表、vStandardizedData View、SP,它使用 View 数据合并到 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

期望的结果:

用户自定义函数返回一个表变量:

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

【问题讨论】:

  • 您没有提供足够的信息:请发布一个(或多个,如果不同的结构)字符串示例。大多数字符串拆分函数将返回一个记录集,从而导致每个字符串部分一个多行。如果您需要新列中的部分并排,您需要列标题和一些逻辑,哪些值在哪里......请显示更多详细信息!
  • 刚刚添加了一些 UDF 代码。要拆分的字符串也显示在注释掉部分的示例中。几乎有 Destination 表、vStandardizedData View、SP,它使用 View 数据合并到 tblStandardizedData 表。因此,在我的 Source 列中,我需要在加载到 tblStandardizedData 表之前拆分列 A 和 B。
  • 对不起,试着用我的头脑思考:我不知道你需要什么...这个 UDF 将返回一个 table。这意味着你必须加入它,你会得到很多行。但是在您的问题中,我阅读了 以拆分为多个列。分隔数据的结构是否合理?你知道一个字符串中的最大零件数吗?请提供一些实际的示例字符串和所需的输出。
  • 最多可以是从 A 列派生的字符串的 5 个实例(B 列也是如此)。还只是添加了字符串的示例和所需的结果。至于 UDFunction 它已经写好了,我被告知要使用它来拆分。现在清楚了吗?
  • 我正在处理五个对象:1) 源文件 2) 目标表 3) vStandardizedData 视图 4) tblStandardizedData 表 5) 合并(更新和插入)形成 vStandardizedData 的存储过程看法。注意:所有 5 个对象都按照它们应该被创建和加载的顺序列出。除此之外,还有一个现有的 UDFunction 可以拆分我被告知要使用的字符串。

标签: sql-server view merge split


【解决方案1】:

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

一般来说:如果您使用 UDF,您将获得table-wise 数据。最好是您的 UDF 将返回该项目以及一个运行编号。否则,您首先需要使用ROW_NUMBER() OVER(...) 创建部件号,以便通过字符串连接创建目标列名称。然后使用PIVOT 获取列并排

更简单的方法是通过 XML 拆分字符串,例如 in this answer

展示原理的快速概念证明:

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

如果您的值可能包含禁止字符(尤其是 &lt;,&gt; and &amp;),您可以在链接的答案中找到处理此问题的方法。

结果

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

【讨论】:

    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    相关资源
    最近更新 更多