2012-08-08 12 views
5

estoy notando que cuando utilizo esta declaración, la columna de la Action no es anulable:Cómo controlar nulabilidad en SELECT INTO para las columnas basadas en literales

SELECT TOP 0 SerialNumber, 0 [Action] INTO #MyTable FROM FSE_SerialNumber 

Pero cuando se utiliza esta declaración, la columna de la Action es anulable:

SELECT TOP 0 SerialNumber, CAST(0 as int) [Action] INTO #MyTable FROM FSE_SerialNumber 

Mi razón para la creación de la mesa de esta manera es porque no quiero que la tabla temporal para heredar la colación de SerialNumber de la colación por defecto del servidor o en otro lugar. Quiero que coincida con la intercalación de FSE_SerialNumber..SerialNumber.

Mi pregunta es, ¿puedo confiar en la función de conversión que me da una columna que admite nulos, o no está claramente definida y podría cambiar. ¿Por qué el yeso de repente hace que la columna sea nula? ¿Hay una mejor manera (además de los comentarios) de aclarar que mi intención es obtener una columna que acepte los valores de nulo aquí?

+0

No sé si esto está documentado, pero en otro lugar también he visto la técnica de usar una variable en lugar de una literal para producir una columna que admite valores.Supongo que es porque la variable (como su expresión) tiene una estructura cuyos metadatos permiten valores NULL, por lo que la nueva columna también lo hace. Y si nombró su variable @NullableInt que podría manejar su problema de auto-documentación. – GilM

Respuesta

5

Parece que la respuesta definitiva es here. Copiando aquí:

Los metadatos se determina sobre la base de la columna y las expresiones de la fuente utilizada en la lista SELECT. A continuación están las reglas:

  1. Cualquier expresión que utiliza una función incorporada como SUBSECUENCIA, izquierda, derecha, etc (excepto ISNULL), por ejemplo, se considera como nullable por el motor . Así que si usa CAST (somecol como char (8)), entonces la expresión es nullable

  2. literales, constantes, variables globales como @@ DBTS, @@ ERROR etc son considerados no anulable ya que regresan un valor siempre

  3. Si la expresión es una columna a continuación nulabilidad se deriva de los metadatos de columna de origen

    Así que para hacer una expresión o columna en la lista SELECT no nula a continuación, utilizar ISNULL alrededor de la columna o expresión.

Por lo tanto, parece que usted es seguro de usar su expresión CAST.

0

Personalmente, para un mejor control, primero debe crear su tabla. Por ejemplo:

Create Table #MyTable (
    SerialNumber int Not Null, -- or however this is correctly defined. 
    Action int Null 
) 

Entonces, hacer un Insertar en la ... Seleccione ... De

Insert Into #MyTable(SerialNumber, Action) 
Select SerialNumber, 0 
From FSE_SerialNumber 

Entonces, no habrá cuestión de lo que los campos deben ser.

Sé que esto no es exactamente lo que usted pidió, pero podría ser algo a considerar.

+0

Problema con esto es que no hay una manera directa de copiar la intercalación de la columna SerialNumber en la tabla temporal a continuación. Lo estaba haciendo a tu manera y tuve que cambiarlo debido a problemas de intercalación. – BlueMonkMN

+0

@BlueMonkMN. Me alegro de que hayas encontrado una solución adecuada, y de hecho estás en lo cierto al decir que no puedes copiar la intercalación cuando creas una tabla, pero puedes incluirla explícitamente en la declaración Crear tabla (para referencia futura). – Jim

0

Sugerencia general rápida para SELECT ... INTO: use ISNULL( con una columna y se creará como una columna NOT NULL en la tabla.

Cuestiones relacionadas