我将以下参数传递给我的存储过程 -
@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的值的最佳方法是什么?
答案 0 :(得分:0)
首先,您需要将键值对的集合分成几行(看起来已经很远了),然后获得冒号的位置,并使用它执行两个SUBSTRING
操作将键和值分开。
此外,这比将每行的键和值存储到单独的变量(仅用于插入表中)要有效得多。如果您将INSERT
中的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
对于该示例,我使用的是SQL#库(我是作者)中的SQLCLR字符串分隔符,该库在免费版本中可用。您可以使用任何喜欢的拆分器,包括SQL Server 2016中引入的内置STRING_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;
当然,SQL#的完整版(即付费版)包括一个用于处理键值对的附加拆分器。它称为 String_SplitKeyValuePairs ,其工作方式如下:
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;
答案 1 :(得分:-1)
答案 2 :(得分:-1)
我将在@ gofr1就这个问题给出的答案的启发下再次尝试这个......
How to insert bulk of column data to temp table?
该答案显示了如何使用XML变量和nodes method来分割逗号分隔数据并将其插入表中的各个列。在我看来,这与你在这里尝试的非常相似。
查看此SQL。它当然不仅仅具有“拆分”功能,但它似乎比根据冒号位置切断字符串更好。
诺尔