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, no entanto, o SQL Server reclama de Somecol
não existir. Existe uma alternativa para isso em uma única declaração?
sql-server
t-sql
Carson Reinke
fonte
fonte
CASE
instrução.INFORMATION_SCHEMA
poderia funcionar como uma solução alternativa.Respostas:
A consulta a seguir usa a mesma ideia que nesta resposta incrível do ypercube :
Funciona assim:
Se
dbo.Customers
tem uma coluna chamadaSomeCol
, em seguida,SomeCol
emSomeCol AS MyTest
resolverá comodbo.Customers.SomeCol
;se a tabela não possuir essa coluna, a referência ainda será válida, porque 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 (que é uma prática desaprovada na maioria das situações, mas, nesse caso, a omissão do alias da tabela ajuda a resolver o problema).
Se a tabela for usada em uma junção e a outra tabela tiver sua própria
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 como isto:fonte
Uma maneira de fazer isso é verificar a existência das colunas e 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 declaração, resultando em um erro.
No entanto, isso significa que você terá duas consultas para escrever e potencialmente alterar no futuro. Mas não acredito que você deva realmente direcionar
SELECT
declarações para colunas que podem não existir.fonte
Você pode usar algum XML para consultar colunas que possam estar na tabela.
Crie um XML a partir de todas as colunas por linha em uma aplicação cruzada e extraia o valor usando a
values()
funçãoNesta consulta, o ID é conhecido, portanto, obtenha-o diretamente da tabela. Col1 e Col2 podem estar lá ou não, para obtê-los usando o XML.
SQL Fiddle
fonte
Minha abordagem difere apenas ligeiramente das outras. Prefiro usar o sistema para isso e simplesmente obter uma contagem, porque você pode atribuir a contagem de colunas a uma variável na parte superior de uma consulta e, em seguida, optar por continuar ou não com base nisso. A desvantagem disso é ... se você tiver o mesmo nome de coluna em várias tabelas, não tem certeza de que a coluna existe na tabela que você deseja consultar. No entanto, a técnica também funciona em tabelas específicas, pois você só deseja obter uma contagem.
O "problema" de solicitá-lo especificamente é - o problema que você está enfrentando. Em geral, se um valor NULL causar problemas, encontre outra maneira de verificar a existência. Essa é uma maneira de fazer isso sem arriscar perturbar o servidor.
fonte
sysobjects
também na sua consulta para verificar se a tabela específica possui essa coluna?SELECT 1 ...
também não erro.EXISTS (SELECT ...)
geralmente é mais rápido do que(SELECT COUNT(*) ...)
o contrário.Se eu entendi direito ...
Você pode usar a consulta como abaixo e agir de acordo com a contagem ... Se a contagem for> 1, significa que você tem a coluna nessa tabela e a contagem = 0, então você não tem essa coluna nessa mesa
SELECT count (*)
FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME IN ('Id')
AND TABLE_SCHEMA = 'dbo' e TABLE_NAME = 'UserBase';
fonte