String oder Binärdaten würden abgeschnitten werden. Die Anweisung wurde beendet

77

Ich habe ein Problem mit dem SQL Server festgestellt. Dies ist die Funktion, die ich erstellt habe:

ALTER FUNCTION [dbo].[testing1](@price int)
RETURNS @trackingItems1 TABLE (
   item       nvarchar  NULL,
   warehouse   nvarchar NULL,
   price int   NULL
) 
AS
BEGIN
   INSERT INTO @trackingItems1(item, warehouse, price)
   SELECT ta.item, ta.warehouse, ta.price 
   FROM   stock ta
   WHERE  ta.price >= @price; 

   RETURN;
END;

Wenn ich eine Abfrage schreibe, um diese Funktion wie die folgende zu verwenden, wird der Fehler angezeigt

String oder Binärdaten würden abgeschnitten werden. Die Anweisung wurde beendet

Wie kann ich dieses Problem beheben?

select * from testing1(2)

So erstelle ich die Tabelle

CREATE TABLE stock(item       nvarchar(50) NULL,
                   warehouse   nvarchar(50) NULL,
                   price int NULL);
user2098512
quelle
17
Es bedeutet einfach, dass Sie einen Wert einfügen, der größer als der maximal zulässige Wert ist. Beispielsweise kann eine Spalte nur bis zu 5 Zeichen enthalten, Sie fügen jedoch eine Zeichenfolge mit 10 Zeichen ein.
John Woo
@JW aber in meiner Tabelle ist der Wert 2 für den Preis enthalten, und der Datentyp ist tatsächlich der gleiche (zB: int)
user2098512
Eine Möglichkeit zum Aufrufen der Funktion ist die Auswahl von [dbo] .testing1 (2) aus dem Tabellennamen
DevelopmentIsMyPassion
@AshReva Wenn ich Ihren Vorschlag versuche, wird folgende Fehlermeldung angezeigt: "Die Spalte" dbo "oder die benutzerdefinierte Funktion oder das Aggregat" dbo.testing1 "können nicht gefunden werden, oder der Name ist nicht eindeutig." aber ich kann bestätigen, dass ich diese Methode bereits in meiner Tabellenwertfunktion habe
user2098512
1
Können Sie die Schemadefinition für die Bestandsliste angeben?
Kane

Antworten:

69

Wenn Sie varcharetc ohne Länge definieren, ist der Standardwert 1.

Wenn n in einer Datendefinitions- oder Variablendeklarationsanweisung nicht angegeben ist, beträgt die Standardlänge 1. Wenn n mit der CAST-Funktion nicht angegeben wird, beträgt die Standardlänge 30.

Wenn Sie also 400 Bytes in der @trackingItems1Spalte erwarten stock, verwenden Sienvarchar(400) .

Andernfalls versuchen Sie,> 1 Zeichen einzufügen nvarchar(1) = fail

Als Kommentar ist dies auch eine schlechte Verwendung der Tabellenwertfunktion, da es sich um eine "Mehrfachanweisung" handelt. Es kann so geschrieben werden und es wird besser laufen

ALTER FUNCTION [dbo].[testing1](@price int)
RETURNS
AS
   SELECT ta.item, ta.warehouse, ta.price 
   FROM   stock ta
   WHERE  ta.price >= @price;

Natürlich können Sie auch eine normale SELECT-Anweisung verwenden.

gbn
quelle
38

Die maximale Länge der Zielspalte ist kürzer als der Wert, den Sie einfügen möchten.

Klicken Sie mit der rechten Maustaste auf die Tabelle in SQL Manager und gehen Sie zu 'Design', um Ihre Tabellenstruktur und Spaltendefinitionen anzuzeigen.

Bearbeiten:

Versuchen Sie, für Ihre nvarchar-Einfügungen eine Länge festzulegen, die gleich oder kürzer ist als die in Ihrer Tabelle definierten.

OakNinja
quelle
Für mich war das Problem mit der Länge der Spalte, so dass der Wechsel von nvarchar(50)zu ntextin SQL Server das Problem löst, Hoffnung hilft jemandem
Shaiju T
@stom Sie sollten immer versuchen, die kleinstmögliche Länge für Ihre Daten zu verwenden. Dadurch bleiben Ihre Tische so klein und schnell wie möglich und es wird auch Absicht gezeigt. Wenn jemand Ihre Datenbank in einigen Jahren indizieren oder migrieren muss, muss er herausfinden, warum die Tabellen so gestaltet sind, wie sie sind. Das heißt, wenn Sie "unbegrenzten" Text in einem Feld möchten, ist ntext eine praktikable Lösung.
OakNinja
Vielen Dank für den Tipp zur Leistung. Im Moment speichere ich Website-Links und einige sind lang, also wähle ich ntext.
Shaiju T
1
@stom Sie können es auf nvarchar (2083) setzen, was die maximale Länge für Internet Explorer ist. Auf diese Weise maximieren Sie Leistung und Kompatibilität.
OakNinja
ya nvarchar(2083) ist der beste Spaltentyp für eine URL von hier , danke.
Shaiju T
19

In meinem Fall bekam ich diesen Fehler, weil mein Tisch hatte

varchar(50)

aber ich habe eine 67 Zeichen lange Zeichenfolge eingefügt, was zu diesem Fehler führte. Ändern in

varchar(255)

Das Problem wurde behoben.

Hammad Khan
quelle
:) Der Wechsel zu varchar (some_value) hat mein Problem behoben.
Naveen Kumar V
8

Geben Sie eine Größe für den Artikel und das Lager an, wie in [dbo]. [Testing1] FUNCTION

@trackingItems1 TABLE (
item       nvarchar(25)  NULL, -- 25 OR equal size of your item column
warehouse   nvarchar(25) NULL, -- same as above
price int   NULL

) 

Da in MSSQL nur nvarchar gleich nvarchar (1) ist, werden die Werte der Spalte aus der Bestandsliste abgeschnitten

Deb
quelle
1

SQL Server 2016 SP2 CU6 und SQL Server 2017 CU12 haben das Ablaufverfolgungsflag 460 eingeführt, um die Details der Kürzungswarnungen zurückzugeben. Sie können es auf Abfrageebene oder auf Serverebene aktivieren.

Abfrageebene

INSERT INTO dbo.TEST (ColumnTest)
VALUES (‘Test truncation warnings’)
OPTION (QUERYTRACEON 460);
GO

Serverebene

DBCC TRACEON(460, -1);
GO

Ab SQL Server 2019 können Sie es auf Datenbankebene aktivieren:

ALTER DATABASE SCOPED CONFIGURATION 
SET VERBOSE_TRUNCATION_WARNINGS = ON;

Die alte Ausgabenachricht lautet:

Msg 8152, Level 16, State 30, Line 13
String or binary data would be truncated.
The statement has been terminated.

Die neue Ausgabenachricht lautet:

Msg 2628, Level 16, State 1, Line 30
String or binary data would be truncated in table 'DbTest.dbo.TEST', column 'ColumnTest'. Truncated value: ‘Test truncation warnings‘'.

In einer zukünftigen Version von SQL Server 2019 ersetzt die Nachricht 2628 standardmäßig die Nachricht 8152.

Gabriele Franco
quelle