Como definir o agrupamento para uma conexão no SQL Server?

10

Como posso definir o agrupamento que o SQL Server usará durante a duração dessa conexão?

Não até eu conectar ao SQL Server eu sei qual agrupamento eu quero usar.

por exemplo. um navegador com o idioma fr-IT se conectou ao site. Todas as consultas que eu executo nessa conexão eu quero seguir o agrupamento idioma francês, variante Itália .

Eu imagino uma propriedade de nível de conexão hipotética, semelhante a SET ANSI_NULLS OFF , mas para collation 1 :

SET COLLATION_ORDER 'French_CI_AS'

SELECT TOP 100 FROM Orders
ORDER BY ProjectName

e mais tarde

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

e mais tarde

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

Ao mesmo tempo, quando um cliente chinês se conecta:

SET COLLATION_ORDER Chinese_PRC_CI_AI_KS_WS

SELECT TOP 100 FROM Orders
ORDER BY ProjectName

ou

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

ou

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

Agora eu poderia alterar cada declaração SELECT no sistema para permitir que eu passe em um agrupamento:

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

Mas você não pode passar uma ordem de agrupamento como um parâmetro para um procedimento armazenado:

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

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

E a cláusula COLLATE não pode me ajudar ao executar um UPDATE ou um SELECT .

Observação: todas as colunas de string do banco de dados já são nchar , nvarchar ou ntext . Eu não estou falando sobre o agrupamento padrão aplicado a um servidor, banco de dados, tabela ou coluna para colunas não-unicode (ou seja, char , varchar , text ). Eu estou falando sobre o agrupamento usado pelo SQL Server ao comparar e classificar as seqüências de caracteres.

Como posso especificar o agrupamento por conexão ?

Veja também

1 sql hipotético que exibe problemas de localidade

    
por Ian Boyd 26.08.2011 в 22:22
fonte

1 resposta

6

Como marc_s comentou, o agrupamento é uma propriedade de um banco de dados ou coluna, e não de uma conexão.

No entanto, você pode substituir o agrupamento no nível de instrução usando a palavra-chave COLLATE .

Usando seus exemplos:

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'學校的操場'

Ainda assim, não consigo encontrar uma declaração sobre o uso de COLLATE com um nome de agrupamento dinâmico, deixando como única solução SQL e EXEC dinâmicas possíveis. Veja esta entrada social.MSDN para um exemplo.

    
por devio 26.08.2011 / 22:59
fonte