Sql server 正在传递给SQL Server 2008 R2中存储过程的拆分逗号分隔参数

Sql server 正在传递给SQL Server 2008 R2中存储过程的拆分逗号分隔参数,sql-server,tsql,split,sql-server-2008-r2,key-value,Sql Server,Tsql,Split,Sql Server 2008 R2,Key Value,正在将以下参数传递给我的存储过程- @AddOns = 23:2,33:1,13:5 我需要用逗号来拆分字符串- SET @Addons = @Addons + ',' set @pos = 0 set @len - 0 While CHARINDEX(',', @Addons, @pos+1)>0 Begin SET @len = CHARINDEX(','), @Addons, @pos+1) - @pos SET @value = SUBSTRING(@Add

正在将以下参数传递给我的存储过程-

@AddOns = 23:2,33:1,13:5
我需要用逗号来拆分字符串-

SET @Addons = @Addons + ','
set @pos = 0
set @len - 0

While CHARINDEX(',', @Addons, @pos+1)>0
Begin
     SET @len = CHARINDEX(','), @Addons, @pos+1) - @pos
     SET @value = SUBSTRING(@Addons, @pos, @len)
现在@value=23:2,我需要得到23,这是我的ID,2,这是我的数量。这是我剩下的代码-

INSERT INTO TABLE(ID, Qty)
VALUES(@ID, @QTY)

set @pos = CHARINDEX(',', @Addons, @pos+@len) + 1
END

那么,在
INSERT
语句中,向我们获取单独字段中23和2的值的最佳方法是什么呢?

请查看这篇博文


Noel

受@gofr1对这个问题的回答启发,我将对此进行另一次尝试

这个答案展示了如何使用XML变量和将逗号分隔的数据拆分并将其插入到表中的各个列中。在我看来,这与你在这里试图做的事情非常相似

看看这个。它当然不像具有“split”函数那样简洁,但它似乎比根据冒号的位置切碎字符串要好


Noel

首先,将键值对集拆分为行(看起来您已经做到了这一点),然后获取冒号的位置,并使用该位置执行两个
子字符串
操作,将键值分开

而且,这比将每一行的键和值存储到单独的变量中以插入到表中要有效得多。如果从分解此数据的
SELECT
中插入
,它将是基于集合的操作,而不是逐行操作

例如:

DECLARE @AddOns VARCHAR(1000) = N'23:2,33:1,13:5,999:45';

;WITH pairs AS
(
  SELECT [SplitVal] AS [Value], CHARINDEX(N':', [SplitVal]) AS [ColonIndex]
  FROM   SQL#.String_Split(@AddOns, N',', 1) -- https://SQLsharp.com/
)
SELECT *,
       SUBSTRING(pairs.[Value], 1, pairs.[ColonIndex] - 1) AS [ID],
       SUBSTRING(pairs.[Value], pairs.[ColonIndex] + 1, 1000) AS [QTY]
FROM   pairs;

/*
Value       ColonIndex    ID     QTY
23:2        3             23     2
33:1        3             33     1
13:5        3             13     5
999:45      4             999    45
*/
GO
对于这个例子,我使用的是在库(我是该库的作者)中找到的SQLCLR字符串拆分器,它在免费版本中可用。您可以使用任何您喜欢的拆分器,包括SQL Server 2016中引入的内置
STRING\u SPLIT

其用途如下:

DECLARE @AddOns VARCHAR(1000) = N'23:2,33:1,13:5,999:45';

;WITH pairs AS
(
  SELECT [value] AS [Value], CHARINDEX(N':', [value]) AS [ColonIndex]
  FROM   STRING_SPLIT(@AddOns, N',') -- built-in function starting in SQL Server 2016
)
INSERT INTO dbo.TableName (ID, QTY)
  SELECT SUBSTRING(pairs.[Value], 1, pairs.[ColonIndex] - 1) AS [ID],
         SUBSTRING(pairs.[Value], pairs.[ColonIndex] + 1, 1000) AS [QTY]
  FROM   pairs;
DECLARE @AddOns VARCHAR(1000) = N'23:2,33:1,13:5,999:45';

SELECT *
FROM   SQL#.String_SplitKeyValuePairs(@AddOns, N',', N':', 1, NULL, NULL, NULL);

/*
KeyID    Key    Value
1        23     2
2        33     1
3        13     5
4        999    45
*/
GO
DECLARE @AddOns VARCHAR(1000) = N'23:2,33:1,13:5,999:45';

INSERT INTO dbo.[TableName] ([Key], [Value])
  SELECT kvp.[Key], kvp.[Value]
  FROM   SQL#.String_SplitKeyValuePairs(@AddOns, N',', N':', 1, NULL, NULL, NULL) kvp;

当然,的完整(即付费)版本包括一个额外的拆分器,用于处理键值对。它被称为String\u SplitKeyValuePairs,工作原理如下:

DECLARE @AddOns VARCHAR(1000) = N'23:2,33:1,13:5,999:45';

;WITH pairs AS
(
  SELECT [value] AS [Value], CHARINDEX(N':', [value]) AS [ColonIndex]
  FROM   STRING_SPLIT(@AddOns, N',') -- built-in function starting in SQL Server 2016
)
INSERT INTO dbo.TableName (ID, QTY)
  SELECT SUBSTRING(pairs.[Value], 1, pairs.[ColonIndex] - 1) AS [ID],
         SUBSTRING(pairs.[Value], pairs.[ColonIndex] + 1, 1000) AS [QTY]
  FROM   pairs;
DECLARE @AddOns VARCHAR(1000) = N'23:2,33:1,13:5,999:45';

SELECT *
FROM   SQL#.String_SplitKeyValuePairs(@AddOns, N',', N':', 1, NULL, NULL, NULL);

/*
KeyID    Key    Value
1        23     2
2        33     1
3        13     5
4        999    45
*/
GO
DECLARE @AddOns VARCHAR(1000) = N'23:2,33:1,13:5,999:45';

INSERT INTO dbo.[TableName] ([Key], [Value])
  SELECT kvp.[Key], kvp.[Value]
  FROM   SQL#.String_SplitKeyValuePairs(@AddOns, N',', N':', 1, NULL, NULL, NULL) kvp;
因此,将按如下方式使用:

DECLARE @AddOns VARCHAR(1000) = N'23:2,33:1,13:5,999:45';

;WITH pairs AS
(
  SELECT [value] AS [Value], CHARINDEX(N':', [value]) AS [ColonIndex]
  FROM   STRING_SPLIT(@AddOns, N',') -- built-in function starting in SQL Server 2016
)
INSERT INTO dbo.TableName (ID, QTY)
  SELECT SUBSTRING(pairs.[Value], 1, pairs.[ColonIndex] - 1) AS [ID],
         SUBSTRING(pairs.[Value], pairs.[ColonIndex] + 1, 1000) AS [QTY]
  FROM   pairs;
DECLARE @AddOns VARCHAR(1000) = N'23:2,33:1,13:5,999:45';

SELECT *
FROM   SQL#.String_SplitKeyValuePairs(@AddOns, N',', N':', 1, NULL, NULL, NULL);

/*
KeyID    Key    Value
1        23     2
2        33     1
3        13     5
4        999    45
*/
GO
DECLARE @AddOns VARCHAR(1000) = N'23:2,33:1,13:5,999:45';

INSERT INTO dbo.[TableName] ([Key], [Value])
  SELECT kvp.[Key], kvp.[Value]
  FROM   SQL#.String_SplitKeyValuePairs(@AddOns, N',', N':', 1, NULL, NULL, NULL) kvp;

有没有一种简单的方法可以在一个变量中得到23,在另一个变量中得到2?有点像拆分,所以设置@Result=Split(request(@value),“:”),然后@Result(0)将等于23,@Result(1)将等于2。您建议将结果存储在类似数组的位置。我认为这是不可能的;至少不是在SQL Server中。如果是的话,我敢肯定谷歌搜索会找到你想要的。我想你是对的。这不能在SQL中以我想要的方式完成。我想知道为什么这会被否决。任何人