CREATE FUNCTION dbo.KeyValuePairs( @inputStr VARCHAR(MAX))
RETURNS @OutTable TABLE
(KeyName VARCHAR(MAX), KeyValue VARCHAR(MAX))
AS
BEGIN
DECLARE @separator CHAR(1), @keyValueSeperator CHAR(1)
SET @separator = ','
SET @keyValueSeperator = ':'
DECLARE @separator_position INT , @keyValueSeperatorPosition INT
DECLARE @match VARCHAR(MAX)
SET @inputStr = @inputStr + @separator
WHILE PATINDEX('%' + @separator + '%' , @inputStr) <> 0
BEGIN
SELECT @separator_position = PATINDEX('%' + @separator + '%' , @inputStr)
SELECT @match = LEFT(@inputStr, @separator_position - 1)
IF @match <> ''
BEGIN
SELECT @keyValueSeperatorPosition = PATINDEX('%' + @keyValueSeperator + '%' , @match)
IF @keyValueSeperatorPosition <> -1
BEGIN
INSERT @OutTable
VALUES (LEFT(@match,@keyValueSeperatorPosition -1),
RIGHT(@match,LEN(@match) - @keyValueSeperatorPosition))
END
END
SELECT @inputStr = STUFF(@inputStr, 1, @separator_position, '')
END
RETURN
END
GO
当输入为“ 1:10,2:20”时 这将输出作为字符串解析
KeyName KeyValue
1 10
2 20
我还需要其他逻辑:我将发送 然后将“体育场”,“ 1:10,2:20”作为函数的输入 输出应为
StadiumA StadiumB
10 20
即:在1:10,2:20中,键1指向A,并在其后附加“体育场”。 键2指向B,并在其后附加“体育场”,以此类推
我已尝试加入
ALTER FUNCTION [dbo].[ParseDeviceTopology](@Type NVARCHAR(255),@Value NVARCHAR(MAX))
RETURNS @Parsed TABLE (Topology NVARCHAR(50),Value NVARCHAR(50))
AS
BEGIN
INSERT INTO @Parsed(Topology,Value)
SELECT @Type + m.Topology + 'Version' AS Topology,p.[1] AS [Value]
FROM (
SELECT j.[key] AS [ID],i.[key],i.value
FROM OPENJSON('["' + REPLACE(@Value,',','","') + '"]') j
-- CROSS APPLY OPENJSON('[' + REPLACE(j.[value],':',',') + ']') i
CROSS APPLY OPENJSON('["' + REPLACE(j.[value],':','","') + '"]') i
) a
PIVOT(MAX(a.value) FOR a.[key] IN ([0],[1])) p
INNER JOIN ( VALUES` ` INNER JOIN ( VALUES
(2,'B')
,(1,'A')
,(3,'C')
)` `m(ID, Topology) ON m.ID = p.[0];
但是我在本地计算机2016 SQL中获得了所需的输出,但是此逻辑使用的OPENJSON与我需要部署的SQL 2014不兼容。请帮帮我
答案 0 :(得分:0)
老实说,我不会在SQL中执行此操作,而是将键值对解析为外部代码中的对象。
如果您绝对必须在SQL中执行此操作,建议您使用https://sqlperformance.com/2012/07/t-sql-queries/split-strings
中详细介绍的CLR字符串拆分器功能。在您的情况下,您需要先通过逗号分隔以返回表格数据的一列,然后再通过该列以半冒号分隔来进行传递。