¿Por qué algo como esto no funciona?
SELECT
CASE
WHEN NULLIF(COL_LENGTH('Customers', 'Somecol'), '') IS NULL THEN NULL
ELSE Somecol
END AS MyTest
FROM Customers;
Solo estoy verificando si la columna existe, sin embargo, SQL Server se queja de que Somecol
no existe. ¿Hay una alternativa a esto en una sola declaración?
sql-server
t-sql
Carson Reinke
fuente
fuente
CASE
declaración.INFORMATION_SCHEMA
podría funcionar como una solución alternativa.Respuestas:
La siguiente consulta utiliza la misma idea que en esta sorprendente respuesta de ypercube :
Funciona así:
si
dbo.Customers
tiene una columna llamadaSomeCol
, a continuación,SomeCol
en laSomeCol AS MyTest
resolverá comodbo.Customers.SomeCol
;si la tabla no tiene esa columna, la referencia seguirá siendo válida, porque ahora se resolverá como
dummy.SomeCol
: lasdummy
columnas pueden ser referenciadas en ese contexto.Puede especificar múltiples columnas "de repuesto" de esa manera. El truco es no usar el alias de la tabla para tales columnas (que es una práctica mal vista en la mayoría de las situaciones, pero en este caso omitir el alias de la tabla lo ayuda a resolver el problema).
Si la tabla se usa en una combinación y la otra tabla tiene la suya
SomeCol
, probablemente necesitará usar la consulta anterior como una tabla derivada antes de usarla en la combinación para mantener el truco funcionando, algo como esto:fuente
Una forma de hacerlo es verificar la existencia de columnas, luego construir el SQL dinámico en función de si esa columna existe o no.
Sin Dynamic SQL, SQL Server intentará evaluar si la columna existe o no incluso antes de ejecutar la declaración, lo que da como resultado un error.
Sin embargo, significa que tendrá 2 consultas para escribir y potencialmente alterar en el futuro. Pero no creo que realmente deba apuntar a
SELECT
declaraciones en columnas que pueden no existir.fuente
Puede utilizar algunos XML para consultar columnas que podrían estar en la tabla.
Cree un XML a partir de todas las columnas por fila en una aplicación cruzada y extraiga el valor utilizando la
values()
función.En esta consulta se conoce el ID, así que obténgalo directamente de la tabla. Col1 y Col2 pueden estar allí o no, así que consígalos usando el XML.
Violín de SQL
fuente
Mi enfoque difiere solo ligeramente de los demás. Prefiero usar el sistema para esto y simplemente obtener un recuento porque puede asignar el recuento de columnas a una variable en la parte superior de una consulta y luego elegir continuar o no según eso. La desventaja de esto es ... si tiene el mismo nombre de columna en varias tablas, no está seguro de que la columna exista en la tabla que desea consultar. Sin embargo, la técnica también funciona en tablas particulares, ya que solo busca obtener un recuento.
El 'problema' de pedirlo específicamente es: el problema que está experimentando. En general, si un valor NULL le causa problemas ... encuentre otra forma de verificar la existencia. Esta es una forma de hacerlo sin arriesgarse a molestar al servidor.
fuente
sysobjects
también en su consulta para verificar si la tabla específica tiene esa columna?SELECT 1 ...
tampoco error.EXISTS (SELECT ...)
generalmente es más rápido que(SELECT COUNT(*) ...)
, no al revés.Si lo entendí correctamente ...
Puede usar la consulta como se muestra a continuación y actuar en función del recuento ... Si el recuento es> 1, significa que tiene la columna en esa tabla, y la cuenta = 0, entonces no tiene esa columna en ese mesa
SELECCIONE recuento (*)
DESDE INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME IN ('Id')
AND TABLE_SCHEMA = 'dbo' y TABLE_NAME = 'UserBase';
fuente