【发布时间】:2017-03-01 06:47:27
【问题描述】:
我有多个结构相同的表,每个表代表不同的客户。在这些表中的每一个中,都有多个包含各种数据字符串的列,其中值由空格分隔,如下所示:
Domain_Name | Account_ID | SiteID | Account_Name | BotExceptions | BlockCountries | BlockedURLs |BlockedIPs
www.Domain1.com | 123456 |987654 | account1 | TR Sites24x7 Tools/ | UK FR IR| www.url1.com/someRsc www.url2.com/someRsc|46.218.22.145 64.129.104.70 92.44.168.111
www.Domain2.com | 345678|321098| account2 | TR Sites24x7 Tools/ | ES GR AX BE| www.url1.com/someRsc www.url2.com/someRsc|46.218.22.145 64.129.104.70 92.44.168.111
因此,在每一列中,所有项目(IP/机器人名称/国家/地区/URL)都连接到由单个空格分隔的单个字符串。例如,“TR Sites24x7 Tools/”实际上是“TR”、“Sites24x7”和“Tools/”。我正在寻找一种方法来构建存储过程并使用 sql / Tsql,解析每列中的字符串并将项目放入类似的行中:
Domain_Name | Account_ID | SiteID | Account_Name | BotExceptions | BlockCountries | BlockedURLs |BlockedIPs
www.Domain1.com| 123456 | 987654 | account1 | TR | UK | www.url1.com/someRsc | 46.218.22.145
www.Domain1.com| 123456 | 987654 | account1 | Sites24x7 | FR | www.url2.com/someRsc | 64.129.104.70
换句话说,将每个值单独放置在一行中,同时在整个表中保持前 4 列不变。由于数据已经在 sql server 2012 DB 的表中,我认为拥有一个可以进行这种解析的 SP 或函数会更简单,但我对该语言不是很精通,可以使用一些帮助。谢谢你。
【问题讨论】:
-
这是一个糟糕的设计。首先,从不在单个列中保留多个值,其次,几乎没有理由让多个表具有相同的结构和相同的含义。你的目标设计也不好。正确的设计是为您当前具有多个值的每一列添加一个表,该表将包含主表的 forgiegn 键和单个值。此外,将不同的客户表统一到一个表中。
-
我同意@ZoharPeled 的观点,但我希望您提出这个问题的部分原因是因为您正试图对数据进行一点标准化。实在是太惨了……
-
我同意原始表的设计不如最优。这是我无法控制的外部脚本的结果,因此这些原始数据默认位于我上面显示的结构中。在解析之后,将我的目标设计更改为多个表,每个表对应于原始表中的一列,这可能是值得的。
标签: sql-server tsql parsing stored-procedures sql-server-2012