给定一个变量@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
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,子查询,应用甚至临时表。哪一个最适合你,是排数和你的需求......