sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo corregir "La lista de selección para la instrucción INSERT contiene menos elementos que la lista de inserción"

El error 120 de SQL Server ocurre cuando no especifica suficientes columnas en su INSERT lista cuando se usa un SELECT lista de los valores a insertar.

Para ser más específicos, sucede cuando usas un SELECT lista en su INSERT declaración, pero el SELECT la lista no devuelve tantas columnas como está especificando con INSERT .

Esto es fácil de arreglar. Simplemente asegúrese de que el número de columnas coincida entre su INSERT y SELECT lista.

Código incorrecto

Aquí hay un ejemplo de código que causa este error.

INSERT INTO OrdersLatest (
    OrderId, 
    OrderDate, 
    OrderDesc
    )
SELECT 
    OrderId,
    OrderDate
FROM OrdersMarch;

Resultado:

Msg 120, Level 15, State 1, Line 1
The select list for the INSERT statement contains fewer items than the insert list. The number of SELECT values must match the number of INSERT columns.

En este caso, especifico tres columnas en mi INSERT , pero solo selecciono dos columnas en mi SELECT lista.

Buen código

Aquí se explica cómo corregir el error anterior.

INSERT INTO OrdersLatest (
    OrderId, 
    OrderDate, 
    OrderDesc
    )
SELECT 
    OrderId,
    OrderDate, 
    OrderDesc
FROM OrdersMarch;

Resultado:

(5 rows affected)

Todo lo que hice fue agregar el OrderDesc columna a SELECT lista.

Especificar menos columnas

El ejemplo anterior obviamente asume que quería insertar la columna adicional. Si no queríamos que se insertara esa columna, deberíamos haberla eliminado de INSERT en total.

Así.

INSERT INTO OrdersLatest (
    OrderId, 
    OrderDate
    )
SELECT 
    OrderId,
    OrderDate
FROM OrdersMarch;

Sin embargo, esto dependería de si tenemos o no algún NOT NULL restricciones en la tabla de destino.

Uso de un comodín en la lista SELECT

También es posible utilizar el asterisco (* ) comodín en SELECT lista.

INSERT INTO OrdersLatest (
    OrderDate, 
    OrderId, 
    OrderDesc
    )
SELECT *
FROM OrdersMarch;

Aunque esto no se considera una buena práctica, ya que podría seleccionar accidentalmente las columnas incorrectas, o podrían estar en el orden incorrecto, etc.