解析存储过程中的多个同步逗号分隔输入
Parse multiple synchronized comma delimited input in stored procedure
我有一个带有 2 个字符串类型输入参数 (varchar(max)) 的存储过程。
@draw = '172, 182, 167'
@game = '100, 101, 100'
我想将它们解析并存储在 table 中,如下所示:
|----------------------------------|
| draw | game |
|----------------------------------|
| 172 | 100 |
| 182 | 101 |
| 167 | 100 |
|----------------------------------|
我怎样才能做到这一点?感谢任何建议,谢谢。
这是我目前尝试过的:
我能够将字符串分成两行,但我无法弄清楚的部分是如何解析 2 个不同的输入并在它们被传递到过程中时以同步方式将它们放入我的 table 中。
这是我解析它们的尝试:
create table report_game_draw (
draw_id varchar(max) NULL,
game_id varchar(max) NULL
)
go
Declare @draw nvarchar(MAX)
Declare @game nvarchar(MAX)
Set @draw ='188,189,190,191,192,193,194'
Set @game ='188,189,190,191,192,193,194'
DECLARE @XML AS XML
DECLARE @XML1 AS XML
DECLARE @Delimiter AS CHAR(1) =','
SET @XML = CAST(('<X>'+REPLACE(@draw,@Delimiter ,'</X><X>')+'</X>') AS XML)
SET @XML1 = CAST(('<X>'+REPLACE(@game,@Delimiter ,'</X><X>')+'</X>') AS XML)
INSERT INTO report_game_draw (draw_id,game_id)
((SELECT N.value('.', 'INT') AS ID FROM @XML.nodes('X') AS T(N),
(SELECT N.value('.', 'INT') AS ID FROM @XML1.nodes('X') AS T(N))
有很多方法可以解决这个问题 - 请注意,尽管 SQL 服务器提供了 string_split 功能,但它仅对这个特定的 use-case 在 Azure 中支持序列号以保证排序。
我倾向于将 Json 功能用于此类流程,如下所示:
declare
@draw varchar(max) = '172, 182, 167',
@game varchar(max) = '100, 101, 100';
select Draw, Game
from (
select Convert(int, j.[value]) as Draw, 1 + Convert(tinyint,j.[key]) Seq
from OpenJson(Concat('["',replace(@draw,',', '","'),'"]')) j
) d join (
select Convert(int, j.[value]) as Game, 1 + Convert(tinyint,j.[key]) Seq
from OpenJson(Concat('["',replace(@game,',', '","'),'"]')) j
) g on d.Seq = g.Seq
我有一个带有 2 个字符串类型输入参数 (varchar(max)) 的存储过程。
@draw = '172, 182, 167'
@game = '100, 101, 100'
我想将它们解析并存储在 table 中,如下所示:
|----------------------------------|
| draw | game |
|----------------------------------|
| 172 | 100 |
| 182 | 101 |
| 167 | 100 |
|----------------------------------|
我怎样才能做到这一点?感谢任何建议,谢谢。
这是我目前尝试过的: 我能够将字符串分成两行,但我无法弄清楚的部分是如何解析 2 个不同的输入并在它们被传递到过程中时以同步方式将它们放入我的 table 中。
这是我解析它们的尝试:
create table report_game_draw (
draw_id varchar(max) NULL,
game_id varchar(max) NULL
)
go
Declare @draw nvarchar(MAX)
Declare @game nvarchar(MAX)
Set @draw ='188,189,190,191,192,193,194'
Set @game ='188,189,190,191,192,193,194'
DECLARE @XML AS XML
DECLARE @XML1 AS XML
DECLARE @Delimiter AS CHAR(1) =','
SET @XML = CAST(('<X>'+REPLACE(@draw,@Delimiter ,'</X><X>')+'</X>') AS XML)
SET @XML1 = CAST(('<X>'+REPLACE(@game,@Delimiter ,'</X><X>')+'</X>') AS XML)
INSERT INTO report_game_draw (draw_id,game_id)
((SELECT N.value('.', 'INT') AS ID FROM @XML.nodes('X') AS T(N),
(SELECT N.value('.', 'INT') AS ID FROM @XML1.nodes('X') AS T(N))
有很多方法可以解决这个问题 - 请注意,尽管 SQL 服务器提供了 string_split 功能,但它仅对这个特定的 use-case 在 Azure 中支持序列号以保证排序。
我倾向于将 Json 功能用于此类流程,如下所示:
declare
@draw varchar(max) = '172, 182, 167',
@game varchar(max) = '100, 101, 100';
select Draw, Game
from (
select Convert(int, j.[value]) as Draw, 1 + Convert(tinyint,j.[key]) Seq
from OpenJson(Concat('["',replace(@draw,',', '","'),'"]')) j
) d join (
select Convert(int, j.[value]) as Game, 1 + Convert(tinyint,j.[key]) Seq
from OpenJson(Concat('["',replace(@game,',', '","'),'"]')) j
) g on d.Seq = g.Seq