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

时间:2011-08-26 20:22:43

标签: sql-server sql-server-2005 locale globalization collation

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

直到我连接到SQL Server才知道我想要使用哪种排序规则。

e.g。语言为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'

同时,中国客户连接时:

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

执行COLLATEUPDATE时,SELECT条款无法帮助我。

注意:数据库中的所有字符串列都已为ncharnvarcharntext。我不是在谈论应用于非unicode列的服务器,数据库,表或列的默认排序规则(即charvarchartext)。我在谈论SQL Server在比较和排序字符串时使用的排序规则。


如何指定per 连接整理?

另见

1 假设的sql表现出语言环境问题

1 个答案:

答案 0 :(得分:6)

正如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。有关示例,请参阅this social.MSDN entry