如何在sql

时间:2019-07-11 05:49:28

标签: sql-server

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不兼容。请帮帮我

1 个答案:

答案 0 :(得分:0)

老实说,我不会在SQL中执行此操作,而是将键值对解析为外部代码中的对象。

如果您绝对必须在SQL中执行此操作,建议您使用https://sqlperformance.com/2012/07/t-sql-queries/split-strings

中详细介绍的CLR字符串拆分器功能。

在您的情况下,您需要先通过逗号分隔以返回表格数据的一列,然后再通过该列以半冒号分隔来进行传递。