【问题标题】:MS SQL Collation Conflict Latin1_General_CI_AS Linked ServerMS SQL 排序规则冲突 Latin1_General_CI_AS 链接服务器
【发布时间】:2016-06-07 05:23:34
【问题描述】:

所以我在发布之前做了一些阅读,并且能够解决大多数失败的作业的大部分排序规则冲突,但是最后一个查询是代理作业中 3 步中的 1 步;我能够通过在联接上添加 COLLATE 子句来解决其他 2 个问题。

在这个查询中,冲突是在 INSERT 语句上,但我知道实际的冲突可能是 Select 语句中的任何列...

这个新的链接服务器最近被迁移,我没有被带入循环,所以他们没有费心检查兼容性问题......或真正测试任何东西......

COMPANY_SQL01 是链接服务器,SQL Server 2014

Company_BRK 是运行此代理作业步骤的主服务器,运行 SQL 2008,但兼容性设置为 SQL 2000(80)...

在尝试对单个查询进行故障排除之前,我进入链接服务器并将所有数据库更改为 SQL_Latin1_General_CP1_CI_AS 排序规则,只有个别列可能仍在 Latin1_General_CI_AS...

我从下面的查询中得到这个错误: 消息 468,第 16 级,状态 9,第 8 行 无法解决等于操作中“SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_CI_AS”之间的排序规则冲突。

set transaction isolation level read uncommitted

declare @current as datetime = getdate()

delete from COMPANY_brk.dbo.COMPANY_ar_avg_days


insert into COMPANY_brk.dbo.COMPANY_ar_avg_days

select distinct cmp_id, sum(datediff(day, invdate, paydate))/count(invoicenum) 'avg_days'
from (
select dat_arobp.IDCUST as cmp_id,
CAST(SUBSTRING(CAST(dat_arobp.DATEBTCH AS CHAR(8)), 1, 4) 
                      + '-' + SUBSTRING(CAST(dat_arobp.DATEBTCH AS CHAR(8)), 5, 2) + '-' + SUBSTRING(CAST(dat_arobp.DATEBTCH AS CHAR(8)), 7, 2) AS smalldatetime) 
                      AS 'paydate', 
COMPANY_brk.dbo.invoiceheader.IVH_DELIVERYDATE AS 'invdate',
dat_arobl.IDINVC 'invoicenum'
from [COMPANY-SQL01].COMPANYdat.dbo.AROBL dat_arobl
inner join COMPANY_brk.dbo.invoiceheader on COMPANY_brk.dbo.invoiceheader.ivh_invoicenumber=dat_arobl.IDINVC
inner join [COMPANY-SQL01].COMPANYdat.dbo.AROBP dat_arobp on dat_arobp.IDMEMOXREF=COMPANY_brk.dbo.invoiceheader.ivh_invoicenumber
where dat_arobl.amtduetc=0 --and dat_arobp.DATERMIT<>'0'
and dat_arobp.IDINVC not in (select i.ivh_invoicenumber from COMPANY_brk.dbo.invoiceheader i)
and datediff(day, COMPANY_brk.dbo.invoiceheader.IVH_DELIVERYDATE, @current)<700
union
select usa_arobp.IDCUST as cmp_id,
CAST(SUBSTRING(CAST(usa_arobp.DATEBTCH AS CHAR(8)), 1, 4) 
                      + '-' + SUBSTRING(CAST(usa_arobp.DATEBTCH AS CHAR(8)), 5, 2) + '-' + SUBSTRING(CAST(usa_arobp.DATEBTCH AS CHAR(8)), 7, 2) AS smalldatetime) 
                      AS 'paydate', 
COMPANY_brk.dbo.invoiceheader.IVH_DELIVERYDATE AS 'invdate',
usa_arobl.IDINVC 'invoicenum'
from [COMPANY-SQL01].COMPANYusa.dbo.AROBL usa_arobl
inner join COMPANY_brk.dbo.invoiceheader on COMPANY_brk.dbo.invoiceheader.ivh_invoicenumber=usa_arobl.IDINVC
inner join [COMPANY-SQL01].COMPANYusa.dbo.AROBP usa_arobp on usa_arobp.IDMEMOXREF=COMPANY_brk.dbo.invoiceheader.ivh_invoicenumber
where usa_arobl.amtduetc=0 --and usa_arobp.DATERMIT<>'0'
and usa_arobp.IDINVC not in (select i.ivh_invoicenumber from COMPANY_brk.dbo.invoiceheader i)
and datediff(day, COMPANY_brk.dbo.invoiceheader.IVH_DELIVERYDATE, @current)<700
) as tbl
group by cmp_id

【问题讨论】:

  • 既然您正在处理 SQL 2000(不再受支持) - 为什么不进行一些数据/数据库复制呢?我知道这不是一个简单的答案,因为您可能会遇到许多问题,因为这只是冰山的开始或一角。
  • 如果有什么不同的话,它实际上是一个 2008 R2 实例,但兼容性设置为 SQL 2000 (80)。关于您的建议,您有任何链接可以查看吗?
  • 在比较两个字符串列或将一个插入另一个列时发生排序错误。因此,只需查看查询中涉及的所有字符串列以了解是什么,然后添加适当的 COLLATE 子句将其转换为不同的排序规则。您可以从 SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLLATION_NAME IS NOT NULL ORDER BY TABLE_NAME, ORDINAL_POSITION 开始
  • 所以我能够确认将字符串从 1 个 DB 与另一个 DB 进行比较的唯一位置是每个 select 语句中的 2 个连接和每个 WHERE 子句中的 1 个,其他一切似乎只有是日期,所以整理对那些人不起作用......查询需要永远完成......不得不取消它......仍然没有运气。

标签: sql-server tsql collation


【解决方案1】:

今天搞定了!

在两个 select 语句的内部连接中,我必须为连接添加 COLLATE SQL_Latin1_Gerenal_CI_AS 来比较主服务器和链接服务器,并为链接服务器添加 COLLATE Latin1_General_CI_AS>主服务器比较:

inner join company_brk.dbo.invoiceheader on 
company_brk.dbo.invoiceheader.ivh_invoicenumber=dat_arobl.IDINVC COLLATE SQL_Latin1_General_CP1_CI_AS

inner join [company-SQL01].flsdat.dbo.AROBP dat_arobp on 
dat_arobp.IDMEMOXREF=company_brk.dbo.invoiceheader.ivh_invoicenumber COLLATE Latin1_General_CI_AS

还得在where子句中加1:

and dat_arobp.IDINC COLLATE DATABASE_DEFAULT NOT IN (select ... )

查询非常慢,大约需要 8 分钟才能更新约 2k 行....但是从永远以来都是这样,所以如果它没有损坏...

/编辑:因此,如果我按原样运行查询,查询工作正常,但如果尝试运行代理作业,则相同的查询(第 2 步,共 3 步)会在其自身上创建一个 LCK_M_U,它甚至不会释放它20 分钟后...仍未完全解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-18
    • 2010-10-07
    • 2012-01-21
    • 2019-01-24
    • 2011-04-17
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多