sql >> Database >  >> RDS >> Sqlserver

Hoe te repareren "De selectielijst voor de INSERT-instructie bevat minder items dan de invoeglijst"

SQL Server-fout 120 treedt op wanneer u niet genoeg kolommen opgeeft in uw INSERT lijst bij gebruik van een SELECT lijst voor de in te voegen waarden.

Om specifieker te zijn, het gebeurt wanneer u een SELECT . gebruikt lijst in uw INSERT statement, maar de SELECT lijst retourneert niet zoveel kolommen als u opgeeft met de INSERT .

Dit is eenvoudig op te lossen. Zorg ervoor dat het aantal kolommen overeenkomt tussen uw INSERT en SELECT lijst.

Slechte code

Hier is een voorbeeld van code die deze fout veroorzaakt.

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

Resultaat:

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.

In dit geval specificeer ik drie kolommen in mijn INSERT , maar ik selecteer slechts twee kolommen in mijn SELECT lijst.

Goede code

Hier leest u hoe u de bovenstaande fout kunt oplossen.

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

Resultaat:

(5 rows affected)

Het enige wat ik deed was de OrderDesc . toevoegen kolom naar de SELECT lijst.

Minder kolommen specificeren

Het vorige voorbeeld gaat er uiteraard van uit dat ik de extra kolom wilde invoegen. Als we niet wilden dat die kolom werd ingevoegd, hadden we deze moeten verwijderen uit de INSERT helemaal.

Vind dit leuk.

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

Dit hangt er echter van af of we al dan niet een NOT NULL . hebben beperkingen op de bestemmingstabel.

Een jokerteken gebruiken in de SELECT-lijst

Het is ook mogelijk om de asterisk (* ) jokerteken in de SELECT lijst.

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

Hoewel dit niet als een goede gewoonte wordt beschouwd, aangezien u per ongeluk de verkeerde kolommen zou kunnen selecteren, of ze in de verkeerde volgorde zouden kunnen staan, enz.


  1. [BIJGEWERKT 2020-01-23] Microsoft Office 365 Build 1912 Breekt de identiteit van ODBC Linked Tables

  2. Stel optie 9 in in SQL Server opgeslagen procedure met behulp van WinHttp.WinHttpRequest.5.1 voor TLS 1.2

  3. SQL Server CRUD-bewerkingen

  4. Query uit twee tabellen in rapport