【问题标题】:OPENJSON collation in Azure Synapse causes a collation conflict errorAzure Synapse 中的 OPENJSON 排序规则导致排序规则冲突错误
【发布时间】:2021-11-26 16:36:38
【问题描述】:

我有一个 OPENJSON 命令,它采用已解析的 JSON,然后 LEFT 将其连接到现有表中。

当我添加 LEFT JOIN 时出现错误:

“Latin1_General_BIN2”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突

该表的所有字符串列具有相同的排序规则: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] 

【问题讨论】:

    标签: azure-synapse open-json


    【解决方案1】:

    我无法重现的有趣问题,但您应该能够通过在 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
    

    一个就够了,你不需要两个。

    【讨论】:

    • 感谢您的建议,不幸的是,两者似乎都不起作用。
    • 啊,如果我反过来做,我会得到更好的结果,即现有_db_data列上的Latin1_General_BIN2
    • 有趣。您的专用 SQL 池的排序规则是什么?
    • 与列相同:SQL_Latin1_General_CP1_CI_AS
    • 我再次尝试使用 SQL_Latin1_General_CP1_CI_AS,但仍然没有运气。左表的 BIN2 排序规则很好,所以谢谢。
    猜你喜欢
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2012-01-21
    • 1970-01-01
    • 2014-02-15
    • 2018-03-20
    • 1970-01-01
    相关资源
    最近更新 更多