Sql 如何拆分两个字符串并插入到两列中

Sql 如何拆分两个字符串并插入到两列中,sql,.net,sql-server,Sql,.net,Sql Server,我有两条线 Declare @WhenDetails NVarchar(Max) ='07:00:0:0;1:00:1:0;6:00:1:0;10:00:1:0;' Declare @Dosage NVarchar(Max) ='1.00;2.00;1.00;1.00' 我需要拆分这2个字符串并插入到一个表中 07:00:0:0=>1.00 1:00:1:0=>2.00时的示例 我已经拿了一张桌子,拆分并插入了我的详细信息 如何填写示例中所示的剂量列 注:我可能有n个记录要分割,我只是举了一个

我有两条线

Declare @WhenDetails NVarchar(Max) ='07:00:0:0;1:00:1:0;6:00:1:0;10:00:1:0;'
Declare @Dosage NVarchar(Max) ='1.00;2.00;1.00;1.00'
我需要拆分这2个字符串并插入到一个表中

07:00:0:0=>1.00 1:00:1:0=>2.00时的示例

我已经拿了一张桌子,拆分并插入了我的详细信息

如何填写示例中所示的剂量列


注:我可能有n个记录要分割,我只是举了一个例子。

可能需要一点JSON+

范例

返回

如果有助于可视化:

我们将字符串转换成一个JSON数组,然后根据键连接结果是一件小事

如果你愿意

从OpenJSON“[”中选择*+replace@WhenDetails“,”;“,”,“+”]

结果将是

key value       type
0   07:00:0:0   1
1   1:00:1:0    1
2   6:00:1:0    1
3   10:00:1:0   1
编辑XML方法


很抱歉,我们仍在使用15.0。我们还有什么别的办法可以做到吗@厕所
Declare @WhenDetails NVarchar(Max) ='07:00:0:0;1:00:1:0;6:00:1:0;10:00:1:0;'
Declare @Dosage NVarchar(Max) ='1.00;2.00;1.00;1.00'

Select RowID = A.[Key]+1
      ,PatientID = null
      ,Dosage = B.[Value]
      ,WhenDetails = A.[Value]
 From (
        Select *
         From  OpenJSON( '["'+replace(@WhenDetails,';','","')+'"]' )
      ) A
 Join (
         Select *
         From  OpenJSON( '["'+replace(@Dosage,';','","')+'"]' )
      ) B
   on A.[Key]=B.[Key]
RowID   PatientID   Dosage  WhenDetails
1       NULL        1.00    07:00:0:0
2       NULL        2.00    1:00:1:0
3       NULL        1.00    6:00:1:0
4       NULL        1.00    10:00:1:0
key value       type
0   07:00:0:0   1
1   1:00:1:0    1
2   6:00:1:0    1
3   10:00:1:0   1
Select RowID = A.RetSeq
      ,PatientID = null
      ,Dosage = B.RetVal
      ,WhenDetails = A.RetVal
 From (
        Select RetSeq = row_number() over (order by 1/0)
              ,RetVal = ltrim(rtrim(B.i.value('(./text())[1]', 'varchar(max)')))
        From  (Select x = Cast('<x>' + replace((Select replace(@WhenDetails,';','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
        Cross Apply x.nodes('x') AS B(i)
      ) A
 Join (
        Select RetSeq = row_number() over (order by 1/0)
              ,RetVal = ltrim(rtrim(B.i.value('(./text())[1]', 'varchar(max)')))
        From  (Select x = Cast('<x>' + replace((Select replace(@Dosage,';','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
        Cross Apply x.nodes('x') AS B(i)
      ) B
   on A.RetSeq=B.RetSeq