【发布时间】: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