Em um dos meus aplicativos, tínhamos tsql como mostrado abaixo
SELECT DISTINCT [Dblist].[DbName] AS [DbName]
FROM [Common].dbo.[Dblist]
WHERE dbname not in (
SELECT [name]
FROM master.dbo.sysdatabases )
Para um dos meus clientes, deu um erro relacionado ao agrupamento, pois o banco de dados Common
(parte do meu aplicativo) possui agrupamento padrão, sql_latin1_general_cp1_ci_as
enquanto o master db possui agrupamento latin1_general_ci_as
. Eu encontrei uma solução usando o agrupamento e funcionou. Eu quero que a solução funcione em todos os agrupamentos.
SELECT DISTINCT [Dblist].[DbName] AS [DbName]
FROM [Common].dbo.[Dblist]
WHERE dbname not in (
SELECT [name] COLLATE DATABASE_DEFAULT
FROM master.dbo.sysdatabases )
Agora eu estou confuso. Devo usar COLLATE em todas as consultas que envolvem bancos de dados do sistema? Quando usar agrupamento e quando não usar?
Além disso, a maneira acima de usar o agrupamento é adequada (como COLLATE DATABASE_DEFAULT)? Aqui DATABASE_DEFAULT é latin1_general_ci_as ele mesmo, pois é o agrupamento do banco de dados mestre. Então, como a solução funcionou, pois eles novamente não correspondem ao banco de dados comum? Eu quero uma solução que funcione em todos os agrupamentos.
Se você for usar agrupamentos personalizados para bancos de dados específicos, sim, precisará fazer com que os agrupamentos correspondam sempre que estiver juntando ou unindo dados dos dois bancos de dados.
Na verdade, você precisará fazer isso com muitas consultas de metadados de qualquer maneira. Basta olhar para as visualizações do catálogo como
sys.tables
:Resultados:
Aqui temos colunas com dois agrupamentos diferentes dentro de um único objeto do sistema. Nenhum banco de dados pode ter um
DATABASE_DEFAULT
que corresponda a ambos...Você não tem nenhum controle sobre o agrupamento das colunas ou bancos de dados de seu cliente ou sobre o agrupamento do servidor. Então, realmente, as únicas maneiras de resolver o conflito são:
DATABASE_DEFAULT
)Como o último é mais trabalhoso, gera consultas mais complexas e apresenta mais oportunidades para transformar buscas em varreduras, acho que o primeiro é realmente sua melhor opção.
De livros on-line
Se você estiver executando sua segunda consulta a partir do
common
banco de dados, o valor demaster.dbo.sysdatabases
está sendo forçado paracommon
o agrupamento de 's, e não o contrário, como você supõe.