Sql-Server

在 ssms 中模擬區分大小寫的排序規則

  • July 15, 2022

我知道無法在 sql server 中為會話設置排序規則

我有不同的伺服器具有不同的排序規則,但是,其中一個是區分大小寫的排序規則,如下圖所示,在細節上可能會更加嚴格。

在此處輸入圖像描述

是否有任何設置或任何我可以做的事情來開發我的腳本,就好像排序規則是區分大小寫的一樣,所以當我需要將腳本移植到區分大小寫的伺服器時,一切都已經好了?

我一直在尋找在不更改任何內容的情況下操縱排序規則,試圖將其限制在我的會話中,可以這麼說,但我找不到任何東西,有什麼我能做的嗎?

set transaction isolation level read uncommitted
set nocount on
set deadlock_priority low


use ReportServer
--select * from sys.tables
select top 10 Name, Path, CreationDate 
 from dbo.catalog 
order by path  COLLATE Latin1_General_100_CI_AS_KS_WS desc

exec sp_help 'dbo.catalog'

DECLARE @SQL nvarchar(max)

SET @SQL='use ReportServer;select top 10 Name, 
        Path, CreationDate from dbo.Catalog order by path  '

SET @SQL=@SQL + 'COLLATE Latin1_General_BIN DESC'

PRINT @SQL
EXEC sp_executesql @SQL


SET @SQL='use ReportServer;select top 10 Name, Path, 
         CreationDate from dbo.Catalog order by path  '

SET @SQL=@SQL + 'COLLATE SQL_Latin1_General_CP1250_CS_AS DESC'

PRINT @SQL
EXEC sp_executesql @SQL


use master
go




SELECT name, COLLATIONPROPERTY(name, 'CodePage') AS Code_Page, description 
FROM sys.fn_helpcollations()
ORDER BY name;

不,除了在同一個實例或測試實例上以不同的名稱恢復數據庫並將數據庫的預設排序規則更改為區分大小寫的排序規則之外,SQL Server 內無法執行此操作。

我也不認為這是可取的,因為數據庫的預設排序規則控制著幾件事,例如數據庫級對象名稱、變數/參數值和字元串文字。其中一些可能在理論上可以模擬“按需”,例如參數/變數/字元串文字值。但是,其他的,例如對象名稱可能是有問題的。例如,如果您目前有一個區分大小寫或二進制排序規則並且想要模擬不區分大小寫的行為,這將允許多個對像看起來具有相同的名稱(例如“Sales”和“sales”),並且會有優化器無法處理這種歧義。

另一個問題,如果這樣的事情是可能的,將是如何處理實例(即伺服器)級排序規則。它處理諸如實例級對象名稱和變數名稱之類的事情。而且,由於實例級排序規則與數據庫級排序規則是分開處理的,因此需要某種方法來分別設置它們。不僅如此,還可能存在其他下游“奇怪”行為。

現在,話雖如此,Visual Studio / SSDT可能會進行一些名稱解析檢查,因為數據庫項目會進行某種級別的驗證(例如,它應該驗證表/列名稱、過程和函式的參數名稱, ETC)。我會試試這個,看看它是否適合您的需求。

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