I union all
as colunas distintas das INFORMATION_SCHEMA.COLUMNS
visualizações de muitos bancos de dados que consulto com uma consulta direta:
select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME from xyz
UNION ALL
select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME from bar
UNION ALL
select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME from foo
Meu objetivo é fazer um mapeamento rápido entre colunas antigas e novas e quaisquer outras colunas que tenham o mesmo nome, ou verificar colunas órfãs e duplicadas. Tendo o distinto TABLE_CATALOG
, TABLE_SCHEMA
, TABLE_NAME
, COLUMN_NAME
de tudo em mãos e unindo-o ao column_name consigo mesmo, obtenho um mapeamento completo de cada coluna para qualquer outra entidade que você possa encontrar.
Tudo funciona bem até que eu também tenha union all
uma tabela que não seja uma INFORMATION_SCHEMA.COLUMNS
visualização, mas uma mera tabela com seu próprio agrupamento na coluna que possui os column_names não dinâmicos nas linhas da field_name
coluna. Por isso preciso fazer as mesmas colunas manualmente, como se fosse uma INFORMATION_SCHEMA.COLUMNS
view:
SELECT DISTINCT 'abc' AS TABLE_CATALOG, 'dbo' AS TABLE_SCHEMA, 'xyz' AS TABLE_NAME, [xyz].field_name AS COLUMN_NAME
FROM xyz
ORDER BY [xyz].field_name;
Como a consulta reúne a saída de muitos catálogos de bancos de dados, não posso apenas codificar em TSQL no SSMS, mas preciso fazer consultas externas de vários bancos de dados e union all
a saída juntos. Eu utilizo o MS Access para isso, mas você também pode atingir esse objetivo com um aplicativo de console em C# no Visual Studio.
E como eu tenho essa consulta (visualização "xyz") que preciso construir manualmente, e como sua coluna field_name tem outro agrupamento além da COLUMN_NAME
coluna da INFORMATION_SCHEMA.COLUMNS
visualização, o seguinte erro é gerado:
Mensagem de erro em alemão:
odbc--chamada falhou. [Microsoft][ODBC SQL Server Driver][SQL Server]Um conflito de classificação entre "SQL_Latin1_General_CP1_CI_AS" e "Latin1_General_CI_AS" no operador UNION ALL, no qual o 4-spalte da resposta SELECT foi adicionado, não pode ser usado. (#451)
Coloque em inglês com deepl:
odbc--chamada falhou. [Microsoft][ODBC SQL Server Driver][SQL Server]Um conflito de agrupamento entre "SQL_Latin1_General_CP1_CI_AS" e "Latin1_General_CI_AS" no operador UNION ALL que ocorre na coluna 4 da instrução SELECT não pode ser resolvido. (#451)
Em seguida, tentei com o agrupamento necessário, consulte Como obtenho algo como a visualização de metadados INFORMATION_SCHEMA.COLUMNS da própria visualização INFORMATION_SCHEMA.COLUMNS? , mas com Latin1_General_CI_AS
meu agrupamento padrão do banco de dados e, portanto, com o agrupamento correto, este erro é gerado:
A instrução SELECT inclui uma palavra reservada ou um nome de argumento com erros ortográficos ou ausentes, ou a pontuação está incorreta.
Tentei alterar os agrupamentos de outras maneiras antes e depois disso, e parece que o MS Acces não permite alterar o agrupamento em um SELECT
comando.
Como posso me livrar desse erro?
O erro é lançado pela coluna 4 (
field_name
=COLUMN_NAME
) da visão que obtenho da tabela de dados (e não como as outras, de umaINFORMATION_SCHEMA.COLUMNS
visão). Você não pode alterar o agrupamento nas consultas do MS Access, ao que parece, ele sempre mostrará o erro que já aparece na pergunta.Para me livrar do erro, encontrei duas soluções alternativas. Você precisa alterá-lo já no servidor, criando uma visualização ou tabela com o agrupamento correto e tomando-o como fonte, ou adota uma destas soluções alternativas:
Você pode fazer uma importação completa da tabela em vez de uma consulta direta.
Então o erro desaparecerá mesmo que o agrupamento não seja o mesmo, você não precisa alterar nada, apenas substitua o nome da visualização de consulta direta pelo nome da tabela importada, basta alterar os sufixos para alterar a
union
consulta que está construído em cima.Você pode alterar um pouco a ordem das visualizações unidas, apenas experimente algumas alterações. Para mim, bastou colocar a visualização xyz que lança erros no 1º ou 2º lugar, em vez de no final da lista ou no 3º lugar. Exemplo com apenas as três visualizações.
então se tornaria:
Essa é a melhor solução alternativa, pois não é necessário baixar a tabela inteira.