Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQl Server将分隔字符串拆分为行_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

SQl Server将分隔字符串拆分为行

SQl Server将分隔字符串拆分为行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我在SQL Server 2008数据库中有一个表,该表有两列,如下所示: 我想选择以下数据: 这种类型的操作在SQL Server中相当痛苦,因为内置的字符串函数非常糟糕。引用的问题使用while循环-这是不必要的。您可以使用递归CTE构造此多功能查询: with t as ( select 'ali' as col1, 'A;B;C' as col2 ), cte as ( select col1, convert(var

我在SQL Server 2008数据库中有一个表,该表有两列,如下所示:

我想选择以下数据:


这种类型的操作在SQL Server中相当痛苦,因为内置的字符串函数非常糟糕。引用的问题使用while循环-这是不必要的。您可以使用递归CTE构造此多功能查询:

with t as (
      select 'ali' as col1, 'A;B;C' as col2
     ),
     cte as (
      select col1,
             convert(varchar(max), left(col2, charindex(';', col2) - 1)) as val,
             convert(varchar(max), stuff(col2, 1, charindex(';', col2), '') + ';') as rest
      from t
      union all
      select col1,
             convert(varchar(max), left(rest, charindex(';', rest) - 1)) as val,
             convert(varchar(max), stuff(rest, 1, charindex(';', rest), '')) as rest
      from cte
      where rest <> ''
     )
select cte.*
from cte;

我也遇到过类似的情况,我使用XML查询解决了这个问题,并将此作为我的解决方案。我对XML查询不是非常精通,所以我不愿分享我的答案,因为我无法逐行完整地解释它,即使它确实有效。我所理解的是,用结束和开始XML标记替换分隔符字符或字符串,并在开始和结束时分别使用一个打开标记和一个关闭标记来转换此字符串

A;B;C
进入这个

<X>A</X>
<X>B</X>
<X>C</X>
您可以使用XML查询语法检索每个节点。X没有什么神奇之处,只是在横截面中的nodes方法中必须使用相同的标记

CREATE TABLE Table1
(
    Column1 VARCHAR(20)
  , Column2 VARCHAR(50)
);

INSERT INTO Table1 (Column1, Column2) VALUES ('Ali', 'A;B;C');
INSERT INTO Table1 (Column1, Column2) VALUES ('Ahmed', 'D;E');

DECLARE @Separator VARCHAR(10);
SET @Separator = ';';


SELECT      a.Column1
          , b.SplitData
FROM        (
                SELECT Column1
                     , CAST('<X>' + REPLACE((
                                                SELECT Column2 AS [*] FOR XML PATH('')
                                            )
                                          , @Separator
                                          , '</X><X>'
                                           ) + '</X>' AS XML) xmlfilter
                FROM   Table1
            ) AS a
CROSS APPLY (
                SELECT LetterIDs.Column2.value('.', 'varchar(50)') AS SplitData
                FROM   a.xmlfilter.nodes('X') AS LetterIDs(Column2)
            ) AS b;

这是你的电话号码。我希望这会有所帮助。

您能做的最好的事情是修复此问题,以便首先正确地规范化表。存储分隔数据是非常糟糕的。但我知道这并不总是可能的。旁注:SQLServer2008和2008R2现在已经没有扩展支持了--是时候升级了!