如何在 SQL Server 中设置连接的排序规则?

问题描述 投票:0回答:1

如何设置 SQL Server 在该连接期间将使用的排序规则?

直到我连接到 SQL Server 后我才知道我想使用什么排序规则。

例如使用语言

fr-IT
的浏览器已连接到该网站。我在该连接上运行的任何查询都想遵循法语,意大利变体排序规则。

我设想了一个假设的连接级别属性,类似于

SET ANSI_NULLS OFF
,但用于排序规则1

SET COLLATION_ORDER 'French_CI_AS'

SELECT TOP 100 FROM Orders
ORDER BY ProjectName

及以后

SELECT * FROM Orders
WHERE CustomerID = 3277 
AND ProjectName LIKE '%l''ecole%'

及以后

UPDATE Quotes
SET IsCompleted = 1
WHERE QuoteName = 'Cour de l''école'

同时,当chinese客户连接时:

SET COLLATION_ORDER Chinese_PRC_CI_AI_KS_WS

SELECT TOP 100 FROM Orders
ORDER BY ProjectName

SELECT * FROM Orders
WHERE CustomerID = 3277 
AND ProjectName LIKE '學校'

UPDATE Quotes
SET IsCompleted = 1
WHERE QuoteName = '學校的操場'

现在我可以更改系统中的每个

SELECT
语句以允许我传递排序规则:

SELECT TOP 100 FROM Orders
WHERE CustomerID = 3278
ORDER BY ProjectName COLLATE French_CI_AS

但是您不能将排序规则作为参数传递给存储过程:

CREATE PROCEDURE dbo.GetCommonOrders 
   @CustomerID int, @CollationOrder varchar(50)
AS

SELECT TOP 100 FROM Orders
WHERE CustomerID = @CustomerID
ORDER BY ProjectName COLLATE @CollationOrder

并且

COLLATE
子句在执行
UPDATE
SELECT
时无法帮助我。

注意: 数据库中的所有字符串列都已经是

nchar
nvarchar
ntext
。我不是在谈论应用于服务器、数据库、表或非 unicode 列的默认排序规则(即
char
varchar
text
)。我说的是 SQL Server 在比较和排序字符串时使用的排序规则。


如何指定每个连接排序规则?

另请参阅

1 假设的 sql 显示区域设置问题

sql-server sql-server-2005 locale globalization collation
1个回答
8
投票

正如 marc_s 注释的那样,排序规则是数据库或列的属性,而不是连接的属性。

但是,您可以使用

COLLATE 关键字覆盖语句级别的排序规则。

使用你的例子:

SELECT * FROM Orders WHERE CustomerID = 3277 AND ProjectName COLLATE Chinese_PRC_CI_AI_KS_WS LIKE N'學校' UPDATE Quotes SET IsCompleted = 1 WHERE QuoteName COLLATE Chinese_PRC_CI_AI_KS_WS = N'學校的操場'
仍然,我找不到关于使用 COLLATE 和动态排序规则名称的语句,留下唯一可能的解决方案动态 SQL 和 EXEC。有关示例,请参阅

此social.MSDN 条目

© www.soinside.com 2019 - 2024. All rights reserved.