Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So beheben Sie „Die Auswahlliste für die INSERT-Anweisung enthält weniger Elemente als die Einfügeliste“

Der SQL Server-Fehler 120 tritt auf, wenn Sie in Ihrem INSERT nicht genügend Spalten angeben Liste bei Verwendung eines SELECT Liste für die einzufügenden Werte.

Genauer gesagt passiert es, wenn Sie ein SELECT verwenden Liste in Ihrem INSERT -Anweisung, aber die SELECT list gibt nicht so viele Spalten zurück, wie Sie mit INSERT angeben .

Dies ist leicht zu beheben. Stellen Sie einfach sicher, dass die Anzahl der Spalten zwischen Ihren INSERT übereinstimmt und SELECT Liste.

Schlechter Code

Hier ist ein Codebeispiel, das diesen Fehler verursacht.

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

Ergebnis:

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 diesem Fall gebe ich in meinem INSERT drei Spalten an , aber ich wähle nur zwei Spalten in meinem SELECT aus Liste.

Guter Code

So beheben Sie den obigen Fehler.

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

Ergebnis:

(5 rows affected)

Ich habe lediglich OrderDesc hinzugefügt Spalte zum SELECT Liste.

Weniger Spalten angeben

Das vorherige Beispiel geht offensichtlich davon aus, dass ich die zusätzliche Spalte einfügen wollte. Wenn wir nicht wollten, dass diese Spalte eingefügt wird, hätten wir sie aus INSERT entfernen sollen insgesamt.

So.

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

Dies hängt jedoch davon ab, ob wir NOT NULL haben oder nicht Beschränkungen für die Zieltabelle.

Einen Platzhalter in der SELECT-Liste verwenden

Es ist auch möglich, das Sternchen (* ) Platzhalter im SELECT Liste.

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

Obwohl dies nicht als bewährte Vorgehensweise angesehen wird, da Sie versehentlich die falschen Spalten auswählen oder sie in der falschen Reihenfolge sein könnten usw.