首页 > 解决方案 > 由于排序规则冲突,无法执行 varchar 值到 varchar 的隐式转换

问题描述

当我尝试更改 SQL Server 中列的排序规则时,出现以下错误。

无法执行 varchar 值到 varchar 的隐式转换,因为 add 运算符中的“Latin1_General_CS_AI”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突导致值的排序规则未解析。

以下是我尝试运行的特定查询。无论我是手动运行查询还是使用 GUI,我都会收到相同的错误。

ALTER TABLE myTable ADD myColumn NVARCHAR(152) COLLATE Latin1_General_CS_AI NULL;

编辑: 在进行更多挖掘后,我认为当 sql server 尝试重建表上的触发器之一时可能会出现问题。部分显示如下...我为糟糕的格式道歉,但我似乎无法正确格式化

编辑 2:感谢您修复我的格式!:) 下面代码部分底部的行似乎是错误的来源。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[payee_audit_update_trigger] on [dbo].[payee] for update as 
begin
    set nocount on
    declare @userId varchar(50), @sqlStatement varchar(255), @appId int, @transactionId int, @insertChangedValues varchar(255), @auditEnabled char(1), @timezoneOffsetMinutes int
    exec AuditGetSessionInfo @@rowcount, @userId output, @sqlStatement output, @appId output, @transactionId output, @insertChangedValues output, @auditEnabled output, @timezoneOffsetMinutes output
    if (@auditEnabled = 'N')
        return
    declare @auditDate datetime
    set @auditDate = dateadd(MINUTE, @timezoneOffsetMinutes, getutcdate())
    insert into audit_log_tx (company_id, application_id, change_date_time, id, table_name, transaction_id, user_id, sql_statement, primary_key_crc, primary_key_values, changed_values)
        select inserted.company_id,@appId, @auditDate, dbo.AuditGetRowId(newId()), 'payee', @transactionId, @userId, @sqlStatement, binary_checksum(rtrim(inserted.id)), rtrim(inserted.id), 
        case when (inserted.company_id = deleted.company_id) or (inserted.company_id is null and deleted.company_id is null) then '' else 'company_id|' + case when deleted.company_id is null then '<null>' else rtrim(deleted.company_id) end + '|' + case when inserted.company_id is null then '<null>' else rtrim(inserted.company_id) end + '^' end + ...
------
case when (inserted.w4_status = deleted.w4_status) or (inserted.w4_status is null and deleted.w4_status is null) then '' else 'w4_status|' + case when deleted.w4_status is null then '<null>' else rtrim(deleted.w4_status) end + '|' + case when inserted.w4_status is null then '<null>' else rtrim(inserted.w4_status) end + '^' end + 

标签: sqlsql-servertsql

解决方案


如何在查询中强制排序:

例如,如果发生在field1 = field2

你可以像这样强制它:

field1 collate Latin1_General_CI_AS = field1 collate Latin1_General_CI_AS

推荐阅读