2010-04-20 44 views
10

我有兩個疑問:無法解析在聯盟的排序規則衝突選擇

首先不起作用:

select hotels.TargetCode as TargetCode from hotels 
union all 
select DuplicatedObjects.duplicatetargetCode as TargetCode 
from DuplicatedObjects where DuplicatedObjects.objectType=4 

,因爲我得到錯誤:

Cannot resolve collation conflict for column 1 in SELECT statement. 

第二部作品:

select hotels.Code from hotels where hotels.targetcode is not null 
union all 
select DuplicatedObjects.duplicatetargetCode as Code 
from DuplicatedObjects where DuplicatedObjects.objectType=4 

結構:

Hotels.Code -PK nvarchar(40) 
Hotels.TargetCode - nvarchar(100) 

DuplicatedObjects.duplicatetargetCode PK nvarchar(100) 
+1

C#在這裏有什麼相關性? – 2010-04-20 08:39:08

+0

@John Skeet我已經糾正了它 – user278618 2010-04-20 08:43:43

回答

9

在兩個表上都使用sp_help。對hotels.TargetCode的排序規則與DuplicatedObjects.duplicateTargetCode上的排序規則不同,因此DB不知道如何處理UNION

您可以在其中一個上強制新的排序規則以匹配另一個排序規則,或將結果放入預定義的臨時表/表中,該表將具有已定義的排序規則。

編輯:您可以使用類似覆蓋現有的整理...

DuplicatedObjects.duplicateTargetCode COLLATE SQL_Latin1_General_CP1_CI_AS 

...查詢。這將使用帶有排序規則SQL_Latin1_General_CP1_CI_AS的duplicateTargetCode。您應該選擇一個與hotels.TargetCode匹配的排序規則。

2

嘗試在加入鏈接服務器時設置查詢中的排序規則仍可能會因Incorrect syntax near 'COLLATE'而失敗,即使您的語法正確。

解決方案:在鏈接服務器屬性中,將Use Remote Collation設置爲False,然後在Collation Name中輸入所需的排序規則類型 - 無需在查詢中強制排序。

+0

這不建議不進行性能測試,因爲它可以徹底改變您的查詢計劃,並導致比查詢中指定排序規則更昂貴的查詢。在一種情況下,在鏈接服務器上指定排序規則時,查詢中指定的排序規則需要2秒的時間花了2分鐘。 – tukushan 2013-04-09 23:43:04

14

您需要添加在選擇部分collation聲明以及 - 不僅在where子句 - 類似如下:

select a.field1 collate DATABASE_DEFAULT, b.otherfield from table1 a, table2 b 
where a.field1 collate DATABASE_DEFAULT = b.field3 
0

如果你聲明的臨時表#list你的排序規則衝突可能消失as

CREATE TABLE #list 
(
record_num INT IDENTITY(1,1), 
TempAcctNum NVARCHAR(40) Collate Database_Default, 
TempAcctName NVARCHAR(100) Collate Database_Default, 
TempNumOfCrds SMALLINT, 
TempSys2Acct NVARCHAR(10) Collate Database_Default, 
TempDelType TINYINT, 
TempStatusOfCrd VARCHAR(100) Collate Database_Default, 
TempLastDate VARCHAR(100) Collate Database_Default, 
TempSys2Acct1 NVARCHAR(10) Collate Database_Default, 
TempShrtName NVARCHAR(50) Collate Database_Default, 
TempAdd1 NVARCHAR(200) Collate Database_Default, 
TempAdd2 NVARCHAR(200) Collate Database_Default, 
TempCity NVARCHAR(100) Collate Database_Default, 
TempState NVARCHAR(100) Collate Database_Default, 
TempZipCode NVARCHAR(50) Collate Database_Default, 
TempOpenDate DATETIME, 
TempFax NVARCHAR(50) Collate Database_Default, 
TempUsr1 NVARCHAR(100) Collate Database_Default, 
TempUsr2 NVARCHAR(100) Collate Database_Default, 
TempUsr3 NVARCHAR(100) Collate Database_Default, 
TempUsr4 NVARCHAR(100) Collate Database_Default, 
TempMemo NTEXT, 
TempMail NVARCHAR(100) Collate Database_Default, 
TempNoSys2Status NVARCHAR(50) Collate Database_Default, 
TempDelete BIT, 
TempEdit BIT, 
TempContName VARCHAR(200) Collate Database_Default, 
TempPhone NVARCHAR(50) Collate Database_Default 
) 
+0

我認爲這可以幫助你 – 2016-01-06 04:53:33

相關問題