verificar validar saber registro insertar existe datos sql sql-server select exists

saber - validar si un registro existe en la base de datos sql



Seleccione columnValue si la columna existe de lo contrario nula (2)

Me pregunto si puedo seleccionar el valor de una columna si existe y simplemente seleccionar null. En otras palabras, me gustaría "levantar" la declaración de selección para manejar el caso cuando la columna no existe.

SELECT uniqueId , columnTwo , /*WHEN columnThree exists THEN columnThree ELSE NULL END*/ AS columnThree FROM (subQuery) s

Tenga en cuenta que estoy en el medio para solidificar mi modelo de datos y diseño. Espero excluir esta lógica en las próximas semanas, pero realmente me gustaría ir más allá de este problema porque el arreglo del modelo de datos es una tarea que requiere más tiempo de lo que me gustaría abordar ahora.

También tenga en cuenta que me gustaría poder hacer esto en una consulta. Entonces no estoy buscando una respuesta como

compruebe primero qué columnas están en su consulta secundaria. Luego modifique su consulta para manejar adecuadamente las columnas en su consulta secundaria.


Como otros ya sugirieron, el enfoque sensato es tener consultas que coincidan con el diseño de su mesa.

Sin embargo, existe un enfoque bastante exótico para lograr lo que se desea en SQL (puro, no dinámico). Se publicó un problema similar en DBA.SE: cómo seleccionar filas específicas si existe una columna o todas las filas si una columna no lo hace, pero era más simple ya que solo se deseaba una fila y una columna como resultado. Su problema es más complejo, por lo que la consulta es más intrincada, por decir lo menos. Aquí está, el enfoque insano:

; WITH s AS (subquery) -- subquery SELECT uniqueId , columnTwo , columnThree = ( SELECT ( SELECT columnThree FROM s AS s2 WHERE s2.uniqueId = s.uniqueId ) AS columnThree FROM (SELECT NULL AS columnThree) AS dummy ) FROM s ;

También asume que uniqueId es único en el conjunto de resultados de la subconsulta.

Probado en SQL-Fiddle

Y un método más simple que tiene la ventaja adicional de que permite más de una columna con una sola subconsulta:

SELECT s.* FROM ( SELECT NULL AS columnTwo, NULL AS columnThree, NULL AS columnFour ) AS dummy CROSS APPLY ( SELECT uniqueId, columnTwo, columnThree, columnFour FROM tableX ) AS s ;

La pregunta también se ha realizado en DBA.SE y ha sido respondida por @Andriy M (usando CROSS APPLY también!) Y Michael Ericsson (usando XML ):
¿Por qué no puedo usar una instrucción CASE para ver si existe una columna y no seleccionarla?


No puede hacer esto con una simple instrucción SQL. Una consulta SQL no se compilará a menos que existan todas las referencias de tabla y columna en la tabla.

Puede hacer esto con SQL dinámico si la "subconsulta" es una referencia de tabla o una vista.

En SQL dinámico, harías algo como:

declare @sql nvarchar(max) = '' SELECT uniqueId, columnTwo, ''+ (case when exists (select * from INFORMATION_SCHEMA.COLUMNS where tablename = @TableName and columnname = ''ColumnThree'' -- and schema name too, if you like ) then ''ColumnThree'' else ''NULL as ColumnThree'' end) + '' FROM (select * from ''+@SourceName+'' s ''; exec sp_executesql @sql;

Para una subconsulta real, podría aproximarse a lo mismo comprobando si la subconsulta arrojó algo con ese nombre de columna. Un método para esto es ejecutar la consulta: select top 0 * into #temp from (<subquery>) s luego verifique las columnas en #temp .