@InStr = '0|ABC|3033.9|3032.4444|0|0|0^1|DEF|3033.2577|3033.053|3032.0808|0|0^2|JHI|3032.8376|3033.2596|3033.2259|3033.322|0^3|XYZ|3032.8376|3032.8376|3032.8376|3032.8376|0'
上面的字符串在一个变量中 @InStr
我想用 STRING_SPLIT
在表中插入值。
正如你所见,这是一个双重分裂。
SELECT Value FROM STRING_SPLIT(@InStr,'^')
生产:
0|ABC|3033.9|3032.4444|0|0|0
1|DEF|3033.2577|3033.053|3032.0808|0|0
2|JHI|3032.8376|3033.2596|3033.2259|3033.322|0
3|XYZ|3032.8376|3032.8376|3032.8376|3032.8376|0
这很好,现在我需要把每一行插入到一个表中。
我不知道如何结合两个分裂做插入。该表有7列,它将填充这些列。
谢谢你的帮助。
5条答案
按热度按时间mw3dktmi1#
首先:你应该避免
STRING_SPLIT()
几乎在任何情况下。它不能保证按预期的排序顺序返回项目。这可能在所有测试中都有效,并且在生产中很难发现错误。已经有各种各样的答案了,最好的应该是表类型参数。但是(如果你不能遵循这条路线),我想建议两种类型安全的方法:
--xml方法(几乎适用于任何版本)
--我们在一个操作中执行双重拆分,并返回一个嵌套的xml,其中包含
<x>
以及<y>
元素--我们可以从基于1的位置获取类型安全的值:
--json方法(需要v2016+)
--比xml更快
--我们将您的字符串转换为一个json数组,每行一个项,然后使用另一个
OPENJSON
检索数组的项。--那个
WITH
-子句引入隐式透视以检索列类型安全的项:两种方法返回相同的结果:
ycl3bljg2#
而不是像这样从.net传递字符串
'a|b|c^d|e|f'
然后必须解析它,将其保留在原始结构(datatable?)中,并在sqlserver中创建一个表类型。然后你可以通过你的结构,而不是这个鹅卵石串。在sql server中:
在c#(未测试和不完整)中:
更多关于这一转变从分裂字符串这里,实际上,在这个答案,以及:
https://stackoverflow.com/a/11105413/61305
nle07wnf3#
可以使用递归cte:
这是一把小提琴。
不幸的是,你不能安全地使用
string_split()
因为它不提供返回值的偏移量。l0oc07j24#
对于管道分隔子字符串的后续拆分,可以使用
openjson()
,如下例所示:然而,这种方法有许多警告。最突出的是:
需要sql server 2016或更高版本,数据库兼容级别需要130或以上;
如果您的数据有任何值得一提的大小(1mb+),那么这段代码的速度可能会慢得让人无法接受。字符串操作不是SQLServer的强项。
我个人建议在sql之外解析这个字符串。如果您要导入的是平面文件,那么ssis数据流将更易于开发和更快地工作。如果它是一个应用程序,那么重新设计它以传递合适的表类型,或者至少传递xml/json blob。
uhry853o5#
我正在生成insert语句,然后执行它。首先我拆分字符串,然后生成insert语句。
注:
我假设第二列是三个字母的代码。
我想这种排列顺序无关紧要