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

Behebung von Msg 8116 „Datum des Argumentdatentyps ist für Argument 1 der Teilzeichenfolgenfunktion ungültig“ in SQL Server

Wenn Sie die SQL Server-Fehlermeldung 8116 mit folgendem Text erhalten:Argumentdatentyp date ist ungültig für Argument 1 der Teilzeichenfolgenfunktion , liegt es daran, dass Sie einer Funktion den falschen Datentyp übergeben – in diesem Fall den SUBSTRING() Funktion.

Sie können denselben Fehler (Msg 8116) auch in vielen anderen Kontexten sehen – er ist nicht auf SUBSTRING() beschränkt Funktion.

Beispiel für den Fehler

Hier ist ein Codebeispiel, das den Fehler erzeugt:

DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(@d, 1, 4);

Ergebnis:

Msg 8116, Level 16, State 1, Line 2
Argument data type date is invalid for argument 1 of substring function.

Hier habe ich ein date übergeben geben Sie als erstes Argument für SUBSTRING() ein , aber das ist nicht erlaubt.

Der SUBSTRING() Die Funktion akzeptiert als erstes Argument einen Zeichen-, Binär-, Text-, Ntext- oder Bildausdruck. Wenn Sie ein Argument übergeben, das nicht zu diesen akzeptierten Typen gehört, tritt der obige Fehler auf.

Wie bereits erwähnt, kann es auch bei anderen Funktionen passieren. In jedem Fall bedeutet dies, dass Sie der Funktion den falschen Datentyp übergeben.

Lösung 1

Wenn Sie an einer Spalte vorbeikommen, überprüfen Sie zunächst, ob Sie die richtige Spalte haben. Die Lösung könnte einfach darin bestehen, den falschen Spaltennamen durch den richtigen Spaltennamen zu ersetzen.

Gleiches gilt, wenn Sie eine Variable übergeben – überprüfen Sie, ob es die richtige Variable ist. Möglicherweise können Sie dieses Problem lösen, indem Sie die falsche Variable durch die richtige ersetzen.

Lösung 2

Wenn Sie sicher sind, dass Sie den richtigen Spaltennamen/die richtige Variable haben, können Sie diesen Fehler beheben, indem Sie das Argument in den entsprechenden Datentyp konvertieren.

Zum Beispiel könnten wir das obige Beispiel wie folgt anpassen:

DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(CAST(@d AS varchar(10)), 1, 4);

Ergebnis:

2020

Lösung 3

Aber bevor wir etwas konvertieren, lohnt es sich manchmal, einen Schritt zurückzutreten und zu überlegen, ob es einen einfacheren Weg gibt, das gewünschte Ergebnis zu erzielen.

Im obigen Beispiel versuchen wir beispielsweise nur, das Jahr aus dem Datum zu extrahieren. In diesem Fall sollten wir besser auf SUBSTRING() verzichten Funktion insgesamt zugunsten von YEAR() Funktion:

DECLARE @d date = '2020-03-04';
SELECT YEAR(@d);

Ergebnis:

2020

Eine andere Möglichkeit wäre die Verwendung von FORMAT() Funktion:

DECLARE @d date = '2020-03-04';
SELECT FORMAT(@d, 'yyyy');

Ergebnis:

2020