Azure Synapse 中的 OPENJSON 排序规则导致排序规则冲突错误
OPENJSON collation in Azure Synapse causes a collation conflict error
我有一个 OPENJSON 命令,它接受已解析的 JSON 并将其左连接到现有的 table。
当我添加 LEFT JOIN 时出现错误:
collation conflict between "Latin1_General_BIN2" and "SQL_Latin1_General_CP1_CI_AS"
table 对所有字符串列具有相同的排序规则:SQL_Latin1_General_CP1_CI_AS
我试过在 LEFT JOIN 中添加 COLLATE DATABASE_DEFAULT,但没有任何改进。
我使用的查询大致如下:
DECLARE @json NVARCHAR(MAX) = '
{
"ExampleJson": {
"stuff": [
{
"_program_id": "hello",
"work_date": "2021-03-23 00:00:00"
}
]
}
}';
SELECT *
FROM
OPENJSON
(
(
@json
), '$.ExampleJson.stuff'
)
WITH (
[program_id] NVARCHAR(255) '$."program_id"'
,[work_date] DATETIME '$."work_date"'
) [json_data]
LEFT JOIN
[existing_db_data]
ON [existing_db_data].[program_id] = [json_data].[program_id]
我无法重现的有趣问题,但您应该能够通过在 WITH 子句中或连接后放置正确的排序规则来解决,例如
WITH (
[program_id] NVARCHAR(255) COLLATE SQL_Latin1_General_CP1_CI_AS '$."_program_id"'
,[work_date] DATETIME '$."work_date"'
) [json_data]
LEFT JOIN [existing_db_data] d ON d.[program_id] = [json_data].[program_id] COLLATE SQL_Latin1_General_CP1_CI_AS
一个就够了,你不需要两者都需要。
我有一个 OPENJSON 命令,它接受已解析的 JSON 并将其左连接到现有的 table。
当我添加 LEFT JOIN 时出现错误:
collation conflict between "Latin1_General_BIN2" and "SQL_Latin1_General_CP1_CI_AS"
table 对所有字符串列具有相同的排序规则:SQL_Latin1_General_CP1_CI_AS
我试过在 LEFT JOIN 中添加 COLLATE DATABASE_DEFAULT,但没有任何改进。
我使用的查询大致如下:
DECLARE @json NVARCHAR(MAX) = '
{
"ExampleJson": {
"stuff": [
{
"_program_id": "hello",
"work_date": "2021-03-23 00:00:00"
}
]
}
}';
SELECT *
FROM
OPENJSON
(
(
@json
), '$.ExampleJson.stuff'
)
WITH (
[program_id] NVARCHAR(255) '$."program_id"'
,[work_date] DATETIME '$."work_date"'
) [json_data]
LEFT JOIN
[existing_db_data]
ON [existing_db_data].[program_id] = [json_data].[program_id]
我无法重现的有趣问题,但您应该能够通过在 WITH 子句中或连接后放置正确的排序规则来解决,例如
WITH (
[program_id] NVARCHAR(255) COLLATE SQL_Latin1_General_CP1_CI_AS '$."_program_id"'
,[work_date] DATETIME '$."work_date"'
) [json_data]
LEFT JOIN [existing_db_data] d ON d.[program_id] = [json_data].[program_id] COLLATE SQL_Latin1_General_CP1_CI_AS
一个就够了,你不需要两者都需要。