2017-07-18 61 views
0

我需要一個查詢,以便從不同的數據庫中(同一臺服務器)不同表JOIN兩列,但我收到此錯誤:在TSQL查詢中使用COLLATE是否會做出永久更改?

Cannot resolve the collation conflict between "A" and "B" in the equal to operation.

錯誤在查詢中,我正在做線始於兩個表格之間的比較。

我知道我可以使用COLLATE來確保兩個比較值具有相同的排序規則,但我想知道這是否對這些表有任何永久效果,如永久性排序規則更改,因爲它們是必需的適用於其他應用程序。

例子:

SELECT t1.value1, t1.value2, t2.value3 
FROM db1.dbo.tbl1 AS t1 
JOIN db2.dbo.tbl2 AS t2 ON t1.ID = t2.ID 
+0

沒有。它會更改排序規則,如果可以,則執行等於操作。它不會永久改變任何東西。 https://docs.microsoft.com/en-us/sql/t-sql/statements/collat​​ions – Leonidas199x

+0

你能告訴我們代碼示例嗎? – whisk

+0

@whisk我添加了一個例子,但我需要的查詢本身非常通用。 – user1676874

回答

1

想想COLLATE像一個「CAST」 ......它只是說「解釋這個字符串作爲此歸類」,這樣就可以使雙方的排序規則是相同的,並做適當的相比較。

從你的例子:

SELECT t1.value1, t1.value2, t2.value3 
    FROM db1.dbo.tbl1 AS t1 
     INNER JOIN JOIN db2.dbo.tbl2 AS t2 
     ON t1.ID COLLATE DATABASE_DEFAULT = t2.ID COLLATE DATABASE_DEFAULT 

在這裏,我只是用「DATABASE_DEFAULT」爲例整理......無論使用哪整理你希望(如果你使用其中一列的排序規則,你只需要ONE COLLATE聲明......在另一個聲明上)。

有意義嗎?

0

要回答你的問題,首先要確定我們在同一頁面上。我們將與情侶表開始:表1上

CREATE TABLE dbo.table1(someText varchar(20)); -- uses default collation: SQL_Latin1_General_CP1_CI_AS 
CREATE TABLE dbo.table2(someText varchar(20) collate Latin1_General_BIN); 

someTxt使用我的服務器默認排序規則(SQL_Latin1_General_CP1_AS)。 table2上的同一列使用Latin1_General_BIN

此查詢與給我錯誤,你看到。

SELECT * 
FROM dbo.table1 t1 
JOIN dbo.table2 t2 
    ON t1.someText = t2.someText; 

錯誤:

Msg 468, Level 16, State 9, Line 23 Cannot resolve the collation conflict between "Latin1_General_BIN" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.

有使用COLLATE兩種常用的方法來解決此錯誤:

選項1 - 在您的查詢

選項2 - 修改表格定義 這裏我將使用COLLATE更改table1上的列以匹配table2上的列。

ALTER TABLE dbo.table1 
ALTER column someText varchar(20) collate Latin1_General_BIN; 

現在我不必在查詢中定義排序規則。

你的問題

I understand I can use COLLATE to make sure both compared values have the same collation, but I was wondering if this has any kind of permanent effect on those tables, as in a permanent collation change, given they are needed as they are for other applications.

如果使用選項1走那麼答案是NO ;以這種方式使用COLLATE不會以任何方式改變表格。如果使用選項2,則YES - 列上的排序規則將永久更改。影響可能很大,也可能根本沒有影響(我對您的應用程序不夠了解)。