Sql 表函数来解析数组数据

Sql 表函数来解析数组数据,sql,sql-server,tsql,Sql,Sql Server,Tsql,我在尝试拆分存储在SQL表字段“SQL Server 2014”中的数组字符串时遇到一些问题 我的数据看起来像 array( "status"=>array("pre"=>"2","aft"=>1) "tier_ppl"=>array("pre"=>5.00,"aft"=>5.00) "tier

我在尝试拆分存储在SQL表字段“SQL Server 2014”中的数组字符串时遇到一些问题

我的数据看起来像

array(
                            "status"=>array("pre"=>"2","aft"=>1)
                            "tier_ppl"=>array("pre"=>5.00,"aft"=>5.00)
                            "tier_commission"=>array("pre"=>5.00,"aft"=>500.00)
                            "tier_commission_datetime"=>array("pre"=>"2017-02-10 12:30:59","aft"=>"2017-02-14 08:54:32")
                            "affiliate_commission"=>array("pre"=>4.00,"aft"=>4.00)
                            "affiliate_commission_datetime"=>array("pre"=>"2017-02-10 12:30:59","aft"=>"2017-02-10 12:30:59")
                        )
我需要让我的输出看起来像:-

arrayname                      pre                           aft

status                         5.00                          5.00

tier_ppl                       5.00                          500.00

tier_commission                5.00                          500.00

tier_commission_datetime       2017-02-10 12:30:59           2017-02-14 08:54:32

affiliate_commission           4.00                          4.00

affiliate_commission_datetime  2017-02-10 12:30:59           2017-02-10 12:30:59
我拥有的每一条记录都会有这样一个数组,尽管有时pre或aft是空的。我曾尝试过拆分函数,但我无法使我的数据按我所希望的方式显示,以前有人做过类似的事情吗

谢谢

这不是最好的方法。复杂的字符串操作是SQL Server中最糟糕的操作之一。在你的开发团队用愚蠢的设计选择(比如你问题中的设计选择)攻击你的整个项目之前,先对他们进行分类。 除此之外,由于我对工作感到厌倦,我决定向您展示在SQL中尝试这样做是多么愚蠢。以下内容适用于您的示例数据,但在大量
pre
aft
值的情况下可能会失败。例如,如果数据中有任何
charindex
patindex
匹配模式

利用此功能,您可以执行以下操作:

declare @a nvarchar(1000) =
'array(
"status"=>array("pre"=>"2","aft"=>1)
"tier_ppl"=>array("pre"=>5.00,"aft"=>5.00)
"tier_commission"=>array("pre"=>5.00,"aft"=>500.00)
"tier_commission_datetime"=>array("pre"=>"2017-02-10 12:30:59","aft"=>"2017-02-14 08:54:32")
"affiliate_commission"=>array("pre"=>4.00,"aft"=>4.00)
"affiliate_commission_datetime"=>array("pre"=>"2017-02-10 12:30:59","aft"=>"2017-02-10 12:30:59")
)';

select replace(left(s.Item,charindex('"=',s.Item,1)),'"','') as arrayname
    ,replace(replace(substring(s.Item,charindex('"pre"=>',s.Item,1),patindex('%,"%',s.Item) - charindex('"pre"=>',s.Item,1)),'"pre"=>',''),'"','') as Pre
    ,reverse(replace(replace(left(reverse(s.Item),charindex('>=',reverse(s.Item),1)-1),')',''),'"','')) as Aft
    ,s.Item
from dbo.DelimitedSplit8K(@a,char(10)) s
where left(Item,1) = '"';
这将输出:

+-------------------------------+---------------------+----------------------+----------------------------------------------------------------------------------------------------+
|           arrayname           |         Pre         |         Aft          |                                                Item                                                |
+-------------------------------+---------------------+----------------------+----------------------------------------------------------------------------------------------------+
| status                        | 2                   | 1                    | "status"=>array("pre"=>"2","aft"=>1)                                                               |
| tier_ppl                      | 5.00                | 5.00                 | "tier_ppl"=>array("pre"=>5.00,"aft"=>5.00)                                                         |
| tier_commission               | 5.00                | 500.00               | "tier_commission"=>array("pre"=>5.00,"aft"=>500.00)                                                |
| tier_commission_datetime      | 2017-02-10 12:30:59 | 2017-02-14 08:54:32  | "tier_commission_datetime"=>array("pre"=>"2017-02-10 12:30:59","aft"=>"2017-02-14 08:54:32")       |
| affiliate_commission          | 4.00                | 4.00                 | "affiliate_commission"=>array("pre"=>4.00,"aft"=>4.00)                                             |
| affiliate_commission_datetime | 2017-02-10 12:30:59 | 2017-02-10 12:30:59  | "affiliate_commission_datetime"=>array("pre"=>"2017-02-10 12:30:59","aft"=>"2017-02-10 12:30:59")  |
+-------------------------------+---------------------+----------------------+----------------------------------------------------------------------------------------------------+

为什么您首先要尝试以这种方式提供SQL Server数据?不幸的是,阵列数据已经以这种方式存储在数据库/表中,并由我们的海外web开发团队完成,刚才有人问我是否有一种方法可以像我描述的那样解析出来。我强烈建议你告诉他们,这不是一项适合SQL Server的任务,他们应该真正改变他们的数据导入方法。你也应该解释一下你希望这些数据去哪里?我假设每个数组是一个不同的表,给定
for
aft
值集中的不同数据类型?表和列的输出是什么?查看空白的
pre
aft
值也会有所帮助。我已经提出了将这些数据分解到相关字段中的建议,而不仅仅是将数组放入一个字段中。我需要能够传递与数组字段所在的记录关联的id并提取值,应该只有一个表,例如OutputArray,并且字段类型都可以是nvarchar类型。关联方佣金日期时间部分没有值的示例(“关联方佣金日期时间”=>数组(“前”=>,“后”=>“2017-02-14 08:16:30”)我应该只留下3列arrayname,pre和aft作为列名。嗨,iamdave,虽然这是一件很有用的事情,可以让我玩一些东西,但我已经向我们的开发团队非常清楚地表明,这不是应该在后端完成的事情,我完全同意您来自哪里。谢谢非常感谢您在这方面的帮助,我们非常感谢您的帮助,并了解一些新情况。