从OPENJSON中选择时使用CONVERT时出错

时间:2019-04-08 15:24:52

标签: sql json tsql sql-server-2017

给出一个变量SYMBOL2,它是一个@PartsData并包含一组json数据,此查询可以正常工作:

VARCHAR(MAX)

但是,假设我想在从jason打开数据时转换一些数据:

SELECT 
       *
FROM OPENJSON(@PartsData)
        WITH (
            PartId INT 'strict $.PartId', 
            ....
            CultureName VARCHAR(3) '$.CultureName',
            PartDescription VARCHAR(2000) '$.PartDescription'
        ) A

关于此,我得到:

  

关键字“ CONVERT”附近的语法不正确。

这可以,但是我需要原始SELECT * FROM OPENJSON(@PartsData) WITH ( PartId INT 'strict $.PartId', .... CultureName VARCHAR(3) '$.CultureName', PartDescription VARCHAR(2000) '$.PartDescription' PhraseHash UNIQUEIDENTIFIER CONVERT([uniqueidentifier],hashbytes('MD2',concat('$.PartDescription', '$.CultureName')) ) A 中的计算值,以便可以加入它:

WITH

1 个答案:

答案 0 :(得分:1)

WITH子句不适用于此情况,但是您可以使用CROSS APPLY计算所需的值行明智,并在联接中使用该值。此示例中的内容:

DECLARE  @tbl TABLE(ID INT,SomeValue VARCHAR(100));
INSERT INTO @tbl VALUES
 (1020,'Values 10 and 20')
,(2030,'Values 20 and 30');

DECLARE @json NVARCHAR(MAX)=
N'{
    "rows":
     [{"id":"1","val1":"10","val2":"20"},
      {"id":"2","val1":"20","val2":"30"},
      {"id":"3","val1":"20","val2":"30"},
      {"id":"4","val1":"40","val2":"30"}
    ]
  }';

  SELECT *
  FROM OPENJSON(@json,'$.rows')
  WITH(id INT,val1 NVARCHAR(10),val2 NVARCHAR(10)) A
  CROSS APPLY(SELECT CAST(CONCAT(A.val1,A.val2) AS INT)) B(ConcatenatedAndCasted)
  INNER JOIN @tbl t ON t.ID=B.ConcatenatedAndCasted;

关于下一个问题:请尝试自行设置MCVE(如我上面所做的那样)。添加样本数据和预期的输出。添加您自己的尝试并解释为什么您的输出不能满足您的需求。这将帮助一千多个单词...

更新

您也可以从JSON数据中检索派生表,如下所示:

  WITH JSON_Data AS
  (
  SELECT *
  FROM OPENJSON(@json,'$.rows')
  WITH(id INT,val1 NVARCHAR(10),val2 NVARCHAR(10)) A
  )
  SELECT * FROM  @tbl t
  INNER JOIN JSON_Data jd ON t.ID=CAST(CONCAT(jd.val1,jd.val2) AS INT);

实际上,有各种使用CTE,子查询,应用甚至临时表的方法。哪一个最适合您,取决于行数和您的需求...