Tenho as seguintes dúvidas:
SELECT *
FROM OPENQUERY([SERVERA],
'SELECT ''SERVERA'',[PhoneNum]
,[PhoneExt]
,COUNT(2) as CNT
FROM [DB].[dbo].[ResourcePhone] WHERE PhoneNum like ''+44%''
OR PhoneNum like ''+41%''
GROUP BY PhoneNum, PhoneExt
HAVING COUNT(2) > 1;')
UNION ALL
SELECT *
FROM OPENQUERY([SERVERB],
'SELECT ''SERVERA'',[PhoneNum]
,[PhoneExt]
,COUNT(2) as CNT
FROM [DB].[dbo].[ResourcePhone] WHERE PhoneNum like ''+44%''
OR PhoneNum like ''+41%''
GROUP BY PhoneNum, PhoneExt
HAVING COUNT(2) > 1;')
Estou recebendo o erro A conversão implícita do valor varchar em varchar não pode ser executada porque o agrupamento do valor não foi resolvido devido a um conflito de agrupamento entre "Latin1_General_CI_AS" e "SQL_Latin1_General_CP1_CI_AS" no operador UNION ALL.
Eu verifiquei o agrupamento das colunas e banco de dados envolvidos e eles são todos arquivos Latin1_General_BIN
. A diferença é SERVERA
tem um agrupamento de SQL_Latin1_General_CP1_CI_AS
e SERVERB
tem um agrupamento de Latin1_General_CI_AS
. Eu tentei adicionar COLLATE SQL_Latin1_General_CP1_CI_AS
aos nomes das colunas, mas isso não funcionou.
Alguém pode aconselhar como resolver isso?
Consulta exata adicionada
SELECT *
FROM OPENQUERY([SERVERA],
'SELECT ''SERVERA'',resourcephone.[PhoneNum]
,resourcephone.[PhoneExt]
,COUNT(2) as CNT
FROM [rtc].[dbo].[ResourcePhone] WHERE PhoneNum like ''+44%''
OR PhoneNum like ''+41%''
GROUP BY PhoneNum, PhoneExt
HAVING COUNT(2) > 1;')
UNION ALL
SELECT *
FROM OPENQUERY([SERVERB],
'SELECT ''SERVERB'' COLLATE Latin1_General_CI_AS, resourcephone.[PhoneNum] COLLATE Latin1_General_CI_AS
,resourcephone.[PhoneExt] COLLATE Latin1_General_CI_AS
,COUNT(2) as CNT
FROM [rtc].[dbo].[ResourcePhone] WHERE PhoneNum like ''+44%''
OR PhoneNum like ''+41%''
GROUP BY PhoneNum, PhoneExt
HAVING COUNT(2) > 1;')
Esta consulta dá a seguinte mensagem:
Msg 457, Nível 16, Estado 1, Linha 1 A conversão implícita do valor varchar em varchar não pode ser executada porque a collation do valor não foi resolvida devido a um conflito de collation entre "Latin1_General_CI_AS" e "Latin1_General_BIN" no operador UNION ALL.
O problema deve estar com a string literal (ou seja, o
''SERVERA''
), pois ela assume o Collation do banco de dados onde essa instrução está sendo executada.Portanto, tente o seguinte para a parte superior da sua consulta:
E, a parte inferior do
UNION ALL
(a parte para[SERVERB]
) provavelmente deve selecionar "SERVERB" em vez de "SERVERA" como a string literal :).E, para ser técnico, está assumindo o agrupamento do banco de dados, não o servidor, embora se a conexão padrão for
master
(ou qualquer banco de dados do sistema), isso seria naturalmente o mesmo que o agrupamento no nível do servidor, pois o servidor level Collation é usado para criar os bancos de dados do sistema.ATUALIZAR:
O novo erro que você está recebendo depois de adicionar a
COLLATE
cláusula à segunda consulta noUNION ALL
é devido à adição daCOLLATE
cláusula a muitos dos campos. Ele precisa ir apenas para a string literal e não para oresourcephone.[PhoneExt]
campo. Fazer aquele passo a mais colocou os campos que já estavam de acordo em conflito. Como ambos os campos da tabela estão emLatin1_General_BIN
, não há necessidade de substituir o Collation noresourcephone.[PhoneExt]
campo de nenhum dos Servidores. É apenas o "campo" literal da string que precisa ser substituído e apenas de um dos dois servidores: você só precisa fazer com que um corresponda ao outro.Adicionar a
COLLATE
cláusula a todos os campos, especialmente aqueles que já estão funcionando conforme o esperado (ou seja, oresourcephone.[PhoneExt]
campo) é desnecessário e complica demais a consulta.