Проблема SQL Server Collation (Msg 468, уровень 16, состояние 9) в операторе IF - PullRequest
0 голосов
/ 07 сентября 2018

Моя проблема возникает с оператором IF "просто-как-то-получается", в результате чего предлагаемые исправления для многих похожих вопросов (например, Не удается разрешить конфликт параметров сортировки в моем запросе ) кажутся бесполезными.

Сообщение об ошибке:

Сообщение 468, Уровень 16, Состояние 9, Процедура #XYZ, Строка 11
Не удается разрешить конфликт сопоставления между «Latin1_General_CI_AS» и «SQL_Latin1_General_CP1_CI_AS» в операции равно.

Известно, что параметры сортировки сервера установлены на SQL_Latin1_General_CP1_CI_AS.

Этот запрос демонстрирует проблему:

-- this procedure (which gets put into tempdb) is called WITHOUT specifying @Choice  
CREATE PROCEDURE #XYZ 
(
    -- all other parameters removed (none of them have default values)
    @Choice AS NVARCHAR(1) = 'Y' 
)
AS  
BEGIN
    IF (@choice = 'Y')  -- error raised here 
    BEGIN
        DECLARE @NULL_STATEMENT AS int -- only here because there's no "do nothing" statement
    END 
    RETURN
END

Как я могу это исправить, учитывая, что изменение параметров сортировки по умолчанию сервера (и / или всех таблиц) НЕ произойдет, и нецелесообразно вставлять «COLLATE DATABASE_DEFAULT» во все запросы, таблицы и т. Д. (для этого решения см. https://www.mssqltips.com/sqlservertip/4395/understanding-the-collate-databasedefault-clause-in-sql-server/ и Не удается разрешить конфликт сопоставления между временной таблицей и объектами sys.objects ).

Близко связанные ссылки:

Документация по предложению COLLATE: https://docs.microsoft.com/en-us/sql/t-sql/statements/collations?view=sql-server-2017

Решение, которое я, вероятно, не смогу использовать: https://www.mssqltips.com/sqlservertip/2901/how-to-change-server-level-collation-for-a-sql-server-instance/

1 Ответ

0 голосов
/ 10 сентября 2018

Я суммировал ответ, предоставленный @Sean Lange (вариант комментария @ Lamak), так как он был удален, прежде чем я смог принять его.

Проблема (подробности см. В комментариях к исходному вопросу) заключалась в том, что я столкнулся с ошибкой! при перемещении рабочего кода на новый сервер. Исправлено было изменение параметра по умолчанию с ASCII (varchar) на nvarchar (UTF-8):

CREATE PROCEDURE #XYZ 
(
    -- all other parameters removed (none of them have default values)
    @Choice AS NVARCHAR(1) = N'Y'  -- Note the leading N
)
AS 
....

Самое странное, что после запуска этой версии мне удалось удалить начальный N, и запрос работал без проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...