Sql-Server

SQL Server 避免在查詢中多次重複排序規則類型

  • May 10, 2017

我有一個查詢,它從源數據庫(DatabaseA)中選擇行,並將它們插入到目標數據庫(Database B)中。數據庫之間的排序規則類型不同,並且無法更改。我需要通過顯式指定 varchar 欄位的排序規則來解決查詢中的排序規則差異。

目前我的查詢如下所示:

INSERT INTO DatabaseB.dbo.Users(
   Id,
   UserNumber,
   FirstName,
   Surname,
   Address1,
   Address2,
   AddressTown,
   AddressCity
)
SELECT 
   Id,
   UserNumber,
   FirstName COLLATE SQL_Latin1_General_CI_AS,
   Surname COLLATE SQL_Latin1_General_CI_AS,
   Address1 COLLATE SQL_Latin1_General_CI_AS,
   Address2 COLLATE SQL_Latin1_General_CI_AS,
   AddressTown COLLATE SQL_Latin1_General_CI_AS,
   AddressCity COLLATE SQL_Latin1_General_CI_AS
FROM DatabaseA.dbo.Users

我的問題是,我可以避免為每個基於字元串的欄位鍵入排序規則類型嗎?有沒有一種方法可以一次為整個查詢指定排序規則類型?如果這不可能,還有其他捷徑嗎?

您可以使用這樣的列定義創建一個視圖:

FirstName COLLATE SQL_Latin1_General_CI_AS, ...

然後,只要您想使用 User 表,就可以改用此視圖。

排序規則是每個字元串列/表達式(不包括 XML 數據類型)。所以從這個意義上說,不,不能為每個表或查詢設置排序規則。

我需要通過顯式指定 varchar 欄位的排序規則來解決查詢中的排序規則差異。

嗯,為什麼?您不需要為INSERT聲明處理此問題。比較兩列或在UNION. 正如您在下面的測試中看到的(只需在不是的數據庫中執行它tempdb),有兩個表,每個表位於不同的數據庫中,每個表都有不同的排序規則——一個是 SQL Server 排序規則,一個是 Windows 排序規則甚至——並且沒有錯誤。如果您遇到錯誤,請在問題中提供更多詳細資訊。

--DROP TABLE #tmp;
CREATE TABLE #tmp (Col1 VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS);
INSERT INTO #tmp ([Col1]) VALUES ('n');

-- DROP TABLE dbo.Tmp;
CREATE TABLE dbo.Tmp (Col1 VARCHAR(50) COLLATE Hebrew_100_CS_AI);

INSERT INTO dbo.Tmp ([Col1])
 SELECT t.[Col1]
 FROM #tmp t;

引用自:https://dba.stackexchange.com/questions/173190