Por que algo assim não funciona?
SELECT
CASE
WHEN NULLIF(COL_LENGTH('Customers', 'Somecol'), '') IS NULL THEN NULL
ELSE Somecol
END AS MyTest
FROM Customers;
Estou apenas verificando se a coluna existe, porém, o SQL Server reclama de Somecol
não existir. Existe uma alternativa para isso em uma única declaração?
A consulta a seguir usa a mesma ideia desta incrível resposta de ypercube :
Funciona assim:
se
dbo.Customers
tiver uma coluna chamadaSomeCol
, entãoSomeCol
emSomeCol AS MyTest
resolverá comodbo.Customers.SomeCol
;se a tabela não tiver tal coluna, a referência ainda será válida, pois agora será resolvida como
dummy.SomeCol
: asdummy
colunas podem ser referenciadas nesse contexto.Você pode especificar várias colunas "sobressalentes" dessa maneira. O truque é não usar o alias da tabela para essas colunas (o que é uma prática desaprovada na maioria das situações, mas, neste caso, omitir o alias da tabela ajuda a resolver o problema).
Se a tabela for usada em uma junção e a outra tabela tiver seu próprio
SomeCol
, você provavelmente precisará usar a consulta acima como uma tabela derivada antes de usá-la na junção para manter o truque funcionando, algo assim:Uma maneira de fazer isso é verificar a existência das colunas e, em seguida, criar o SQL dinâmico com base na existência ou não dessa coluna.
Sem o SQL dinâmico, o SQL Server tentará avaliar se a coluna existe ou não antes mesmo de executar a instrução, resultando em um erro.
Isso, no entanto, significa que você terá 2 consultas para escrever e potencialmente alterar no futuro. Mas não acredito que você deva realmente direcionar
SELECT
declarações em colunas que podem não existir.Você pode usar algum XML para consultar colunas que possam estar na tabela.
Crie um XML de todas as colunas por linha em uma aplicação cruzada e extraia o valor usando a
values()
função.Nesta consulta, o ID é conhecido, portanto, obtenha-o diretamente da tabela. Col1 e Col2 podem estar lá ou não, então pegue-os usando o XML.
SQL Fiddle
Minha abordagem difere apenas um pouco das outras. Eu prefiro usar o sistema para isso e simplesmente obter uma contagem porque você pode atribuir a contagem de colunas a uma variável no topo de uma consulta e depois optar por prosseguir ou não com base nisso. A desvantagem disso é… se você tiver o mesmo nome de coluna em várias tabelas, não terá certeza de que a coluna existe na tabela que deseja consultar. No entanto, a técnica também funciona em tabelas específicas, já que você está apenas procurando obter uma contagem.
O 'problema' de pedir especificamente é -- o problema que você está enfrentando. Em geral, se um valor NULL causar problemas… encontre outra maneira de verificar a existência. Esta é uma maneira de fazer isso sem correr o risco de perturbar o servidor.
Se eu entendi direito...
Você pode usar a consulta como abaixo e agir de acordo com base na contagem ... Se a contagem for > 1, isso significa que você tem a coluna nessa tabela e a contagem = 0, então você não tem essa coluna naquela tabela
SELECT count(*)
FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME IN ('Id')
AND TABLE_SCHEMA='dbo' e TABLE_NAME ='UserBase' ;