Tenho várias consultas, em alguns bancos de dados diferentes, que uso para gerar relatórios delimitados. Estou tentando criar alguns novos relatórios em um banco de dados MSSQL e estou tendo problemas para replicar nossos outros processos para obter resultados consistentes.
Quando eu consulto as outras fontes, recebo '' e 0 no lugar de nulos. Quando eu consulto no MSSQL, recebo os nulos.
Estou usando strings DSN => ODBC => banco de dados remoto para algumas consultas... e strings de conexão direta para outras consultas.
Portanto, em um banco de dados DB2:
SELECT OrderID, CustomerName
FROM OrderTable LEFT JOIN CustomerTable on OrderCustomerID = CustomerID
Suponha que a CustomerTable não tenha um cliente, portanto, para OrderID 1, nenhum customerID o resultado seria (saída como uma | lista delimitada):
0|Joe Schmoe
1|NULL
2|Jane Doe
Ao usar o DB2, obtenho "1|". Ao usar o MSSQL, recebo "1 | nulo".
Usando ODBC, strings de conexão, configurações do servidor... como posso retornar "" ou 0 em nulos para obter a saída para corresponder aos nossos outros processos?
Eu tentei uma conexão direta (sem DSN/ODBC). Eu tentei configurações diferentes no ODBC. Todos os três drivers SQL (SQL Server, SQL Native Client, SQL Server Native Client 10.0). Todos estão voltando com NULL em vez de "padrão" para o tipo de dados.
Atualização/esclarecimento Estou trabalhando com um programa ETL "interno" que extrai e transforma dados de bancos de dados internos para exportação para outras instituições/clientes principalmente por meio de texto delimitado. Anteriormente, todas as consultas que eu usei, quando atingidas com nulos, tinham simplesmente a saída ""/0. O MSSQL obviamente não faz isso, então estou tentando imitar as outras fontes no nível mais genérico possível.
Entendo como IsNull/Colesce funciona e, se necessário, usarei isso para fazer o trabalho. O problema óbvio com o uso de IsNull/Colesce é o código adicionado, no que haverá muitas consultas. Código adicionado significa manutenção mais difícil, mais tempo de criação, mais pontos de falha, etc. Se eu pudesse simplesmente dizer ao nível de conexão para substituir todos os nulos, acho que seria muito mais fácil... ? e se sim como? Na instância do SQL2005 Server ou no outro lado da conexão na conexão ODBC ou string de conexão.
O SQL Server sempre retorna NULLs neste caso. Não conheço nenhuma maneira globalmente (por meio de configurações do servidor ou strings de conexão) fazer com que ele retorne strings vazias ou zeros em vez de NULLs. E não acho que seja um problema de biblioteca de banco de dados - usar drivers diferentes não mudará nada. Esta é apenas a maneira como o SQL Server se comporta.
Se você deseja converter NULLs em outra coisa, precisará usar explicitamente a
IsNull(Expression, ValueIfNull)
função ou aCoalesce()
função semelhante que recebe vários parâmetros e retorna o primeiro valor não nulo.Embora um comentário ... por que haveria um pedido sem cliente? Um cliente sem pedido não seria mais provável?
Atualizar
Você pode colocar um wrapper que, do lado do cliente, converta os NULLs para o que você deseja? Que processo ou programa você está usando para converter os conjuntos de resultados em texto?
Não sei por que você acha que precisa mudar isso no nível do driver. Você não pode simplesmente alterar sua consulta para o seguinte, que deve funcionar bem no SQL Server e no DB2:
(Embora você queira qualificar adequadamente suas referências de coluna.)