我怎樣才能解決這個問題?
如果我洗掉第 2 行,則查詢作業正常。
SELECT case when ID_DonVi_Di > 0 then 'dv' cast(ID_DonVi_Di as nvarchar) else MaChiNhanh_Di end as ID_NoiDi
, case when ID_DonVi_Di > 0 then dvdi.Ten_DonViNgoai else cndi.TenChiNhanh end as NoiDi
, case when ID_DonVi_Den > 0 then 'dv' cast(ID_DonVi_Den as nvarchar) else MaChiNhanh_Den end as ID_NoiDen
--, case when ID_DonVi_Den > 0 then dvden.Ten_DonViNgoai else cnden.TenChiNhanh end as NoiDen
FROM
[dbo].[ToTrinh] a
left join
dbo.DM_CHINHANH cndi on a.MaChiNhanh_Di = cndi.MaChiNhanh COLLATE Latin1_General_CI_AS
left join
dbo.DM_CHINHANH cnden on a.MaChiNhanh_Den = cnden.MaChiNhanh COLLATE Latin1_General_CI_AS
left join
[dbo].DM_DonViNgoai dvdi on a.ID_DonVi_Di = dvdi.ID_DonViNgoai
left join
[dbo].DM_DonViNgoai dvden on a.ID_DonVi_Den = dvden.ID_DonViNgoai
where a.TonTai = 1
在此處輸入影像描述
uj5u.com熱心網友回復:
您需要更改一個欄位的排序規則以匹配另一個欄位的排序規則。
例如,如果 A 列有排序規則 Latin1_General_CI_AS...
并且 B 列有排序規則 SQL_Latin1_General_CP1_CI_AS...
你可以這樣做:
CASE WHEN X > 0 THEN A ELSE B COLLATE Latin1_General_CI_AS END
或者像這樣的東西:
CASE WHEN X > 0 THEN A COLLATE SQL_Latin1_General_CP1_CI_AS ELSE B END
uj5u.com熱心網友回復:
@Jortx 的答案是 100% 正確的,并且解決了這個特定查詢的問題。但是,如果您發現需要一遍又一遍地執行此操作,則可能值得更改其中一列的排序規則以匹配架構中的另一列。通用語法是:
alter table dbo.foo
alter column bar nvarchar(400) collate SQL_Latin1_General_CP1_CI_AS;
也就是說,您將按照您希望的方式指定列的所有屬性。請注意,這是一個資料大小操作,因此根據表中的行數,可能需要一段時間。此外,還需要洗掉列上的任何非聚集索引。
那么這樣的事情是怎么發生的呢?推測性地,您的一位開發人員在某個時候在資料庫具有不同默認排序規則的另一個環境中創建了該表。然后,在準備將該表部署到生產環境的程序中,將該表撰寫成腳本。該腳本明確說明了這些列的排序規則,因此無論開發人員在撰寫腳本時的排序規則是什么,都會通過環境。我建議追下去。不是要對任何人進行嚴厲的談話,而是要防止這種事情發生。
是否有正當理由在同一個資料庫中有不同的排序規則?當然!但在這種情況下,所涉及的兩個排序規則非常相似,以至于感覺其中一個是疏忽。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/451045.html
