Pregunta

Supongamos que una definición de tabla en SQL Server de la siguiente manera:

CREATE TABLE MyTable (
  Id   UNIQUEIDENTIFIER NULL,
  Info VARCHAR(MAX)
)

Y una consulta:

DECLARE @id UNIQUEIDENTIFIER
DECLARE @info VARCHAR(MAX)
IF @id IS NOT NULL
BEGIN
  SELECT @info = Info
    FROM MyTable
    WHERE Id = @id
END

En ese caso, el analizador de código estático Visual Studio produce el siguiente error:

  

Advertencia: SR0007:   Microsoft.Performance: anulable   columnas pueden hacer que los resultados finales sean   evaluado como NULL para el predicado.

No veo el problema aquí. El error está relacionado con el rendimiento; MSDN dice que debería utilizar ISNULL () - pero una comparación frente a igual a NULL siempre es falsa, ¿verdad? Me estoy perdiendo algo, o es la advertencia simplemente incorrecto?

¿Fue útil?

Solución

Creo que se refiere a la cláusula WHERE. Es como decir que tanto el parámetro y su columna puede ser nulo, en cuyo caso la cláusula WHERE ya no se evalúa como verdadero / falso. Canalizando su columna anulable en uno que siempre tiene un valor definido (a través de ISNULL), que está en mejor forma, la lógica se refiere.

Aquí está la documentación de Microsoft en dicho error.

Por un lado, los nulos supuestamente realizar consultas un skosh más lentas.

Otros consejos

Creo que el analizador podría no estar tomando en cuenta su estado de SI.

Su código me parece correcto.

Creo que es una advertencia falsa - se puede suprimirlo en una base de caso por caso, o que la alerta especial por completo

?

¿Qué pasa cuando se hace esto:?

CREATE TABLE MyTable (
  Id   UNIQUEIDENTIFIER NOT NULL,
  Info VARCHAR(MAX)
)

Comparación nulo depende de la configuración.

When SET ANSI_NULLS is ON, all comparisons against a null value evaluate to UNKNOWN

When SET ANSI_NULLS is ON, a SELECT statement that uses WHERE column_name = NULL returns zero rows even if there are null values in column_name. A SELECT statement that uses WHERE column_name <> NULL returns zero rows even if there are no nnull values in column_name.

When SET ANSI_NULLS is OFF, the Equals (=) and Not Equal To (<>) comparison operators do not follow the ISO standard.

Este es de aquí .

IF @id IS NOT NULL

debe sustituirse por

IF ISNull(@id, -1) <> -1

@ Raj: "SI isnull (@id, -1) <> -1"

Yo no lo haría, ya que en realidad sustituye a la entrada de la tabla

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top