无法解决排序规则冲突 - SQL脚本中的问题

时间:2017-11-24 08:18:48

标签: sql-server

我在SSMS 2017中遇到了一个问题。我正在尝试设置一个在backgroud中运行SQL脚本的内部应用程序。在设置过程中,我收到以下错误:

  

异常:执行脚本失败:xxx.sql ..无法解析   “SQL_Latin1_General_CP1_CI_AS”与“SQL_Latin1_General_CP1_CI_AS”之间的整理冲突   UNION操作中的“Latin1_General_CI_AS”..

我尝试过以下方法来解决问题但仍然存在:

  1. 使用“SQL_Latin1_General_CP1_CI_AS”作为默认排序规则创建空白数据库,然后再次运行安装程序。
  2. 使用“Latin1_General_CI_AS”作为默认排序规则创建空白数据库,然后再次运行安装程序。
  3. 尝试将服务器上的本地语言更改为英语(英国)而不是英语(美国),然后再次运行设置。
  4. 值得注意的是,同一SQL实例上的其他数据库(按预期工作)的默认排序规则设置为“Latin1_General_CI_AS”。此外,我无法在SQL脚本中进行更改,因为它在后台运行。我只能在SSMS数据库中进行更改。

    可能导致此问题的原因是什么?另外,我还可以尝试解决此问题吗?

2 个答案:

答案 0 :(得分:0)

更改数据库排序规则不会更新已经分配了不同排序规则的列,因此问题是:某些表中某些列可能错误地设置为不同排序规则的几率是多少?您测试的空白数据库的创建?如果您在其中一个空白数据库中运行以下查询,您会得到结果吗?

DECLARE @COLLATION AS VARCHAR(128);

SELECT @COLLATION = collation_name 
FROM sys.databases 
WHERE database_id = DB_ID()
;

SELECT C.*
FROM sys.Columns C
INNER JOIN sys.Tables T
    ON C.object_id = T.object_id
    AND T.is_ms_shipped = 0
WHERE C.collation_name <> @COLLATION
;

如果您的列不匹配,您可以尝试首先执行更新这些特定字段的排序规则的脚本,从而允许您的第二个脚本无错误地执行。如果脚本依赖于匹配的排序规则,那么最好合并这个检查/修复,因为将来可能遇到同样的问题。

是否根据旧的有问题的数据库从脚本创建了空白数据库?如果是这样,我必须假设在该数据库中对您的排序规则进行了干预,问题只是逐渐渗透到新的空白数据库中。

答案 1 :(得分:0)

  

在同一SQL上的其他数据库(按预期工作)   实例的默认排序规则设置为&#34; Latin1_General_CI_AS&#34;

这让我觉得你的Server CollationLatin1_General_CI_AS,无论如何,你可以这样检查:

select SERVERPROPERTY('Collation')

因此,您的server collationLatin1_General_CI_AS,但您的应用程序正在使用旧的(旧版)排序规则SQL_Latin1_General_CP1_CI_AS

我想它的表只有具有此排序规则的列,现在它对您的system databases运行查询,并且所有系统表都有Latin1_General_CI_AS,或者它只创建临时表还会继承Latin1_General_CI_AS的{​​{1}}。

如果你无法访问它的代码(似乎应用程序写了你正在使用的文件:tempdb),你应该安装另一个SQL Server实例,在安装过程中选择xxx.sql为{{1 }}

如果您可以访问应用程序执行的代码,请使用它更新您的问题,也许可以使用SQL_Latin1_General_CP1_CI_AS子句进行更改。