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

问题描述 投票:2回答:1

给定一个变量@PartsData,它是一个VARCHAR(MAX)并包含一组json数据,这个查询工作正常:

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

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

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

在此,我得到:

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

这工作正常,但我需要原始WITH中的计算值,所以我可以加入它:

SELECT 
       *
       , CONVERT([uniqueidentifier],hashbytes('MD2',concat(CAST(A.PartDescription as NVARCHAR(max)),A.CultureName))) AS PhraseHash
FROM OPENJSON(@PartsData)
        WITH (
            PartId INT 'strict $.PartId', 
            ....
            CultureName VARCHAR(3) '$.CultureName',
            PartDescription VARCHAR(2000) '$.PartDescription'
        ) A
sql json tsql sql-server-2017
1个回答
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(就像我上面所做的那样)。添加样本数据和预期输出。添加您自己的尝试并解释,为什么您的输出不能满足您的需求。这将有助于超过千言万语......

UPDATE

您可以从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,子查询,应用甚至临时表。哪一个最适合你,是排数和你的需求......

© www.soinside.com 2019 - 2024. All rights reserved.