我知道无法在 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)。我会试试这个,看看它是否适合您的需求。