Sql-Server
SQL Server 避免在查詢中多次重複排序規則類型
我有一個查詢,它從源數據庫(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;