String of binaire gegevens worden afgekapt. De verklaring is beëindigd

Ik heb een probleem ondervonden met de SQL-server, dit is de functie die ik heb gemaakt:

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;

Als ik een query schrijf om die functie te gebruiken, zoals de volgende, krijg ik de foutmelding

String of binaire gegevens worden afgekapt. De verklaring is beëindigd

Hoe kan ik dit probleem oplossen?

select * from testing1(2)

Dit is de manier waarop ik de tabel maak

CREATE TABLE stock(item       nvarchar(50) NULL,
                   warehouse   nvarchar(50) NULL,
                   price int NULL);

Antwoord 1, autoriteit 100%

Als u varcharenz. definieert zonder een lengte, de standaard is 1.

Als n niet is opgegeven in een gegevensdefinitie of variabele declaratie, is de standaardlengte 1. Als n niet is opgegeven met de CAST-functie, is de standaardlengte 30.

Dus, als je 400 bytes verwacht in de @trackingItems1kolom van stock, gebruik dan nvarchar(400).

Anders probeer je >1 teken in nvarchar(1)= fail

te passen

Als opmerking is dit ook slecht gebruik van de tabelwaardefunctieomdat het “multi-statement” is. Het kan zo worden geschreven en het zal beter werken

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

Je kunt natuurlijk ook gewoon een normaal SELECT-statement gebruiken..


Antwoord 2, autoriteit 58%

De maximale lengte van de doelkolom is korter dan de waarde die u probeert in te voegen.

Klik met de rechtermuisknop op de tabel in SQL Manager en ga naar ‘Ontwerpen’ om uw tabelstructuur en kolomdefinities te visualiseren.

Bewerken:

Probeer een lengte op uw nvarchar-inserts in te stellen die hetzelfde of korter is dan wat in uw tabel is gedefinieerd.


Antwoord 3, autoriteit 32%

In mijn geval kreeg ik deze foutmelding omdat mijn tafel

. had

varchar(50)

maar ik injecteerde een string van 67 tekens, wat resulteerde in deze fout. Verander het in

varchar(255)

het probleem opgelost.


Antwoord 4, autoriteit 11%

Geef een maat op voor het itemen magazijnzoals in de [dbo].[testing1] FUNCTIE

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

Aangezien in MSSQL alleen zeggen dat alleen nvarchargelijk is aan nvarchar(1), worden de waarden van de kolom uit de tabel aandelenafgekapt


Antwoord 5, autoriteit 4%

SQL Server 2016 SP2 CU6 en SQL Server 2017 CU12
heeft traceringsvlag 460 geïntroduceerd om de details van inkortingswaarschuwingen te retourneren.
U kunt het inschakelen op queryniveau of op serverniveau.

Zoekniveau

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

Serverniveau

DBCC TRACEON(460, -1);
GO

Vanaf SQL Server 2019 kunt u het op databaseniveau inschakelen:

ALTER DATABASE SCOPED CONFIGURATION 
SET VERBOSE_TRUNCATION_WARNINGS = ON;

Het oude uitvoerbericht is:

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

Het nieuwe uitvoerbericht is:

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 een toekomstige release van SQL Server 2019 zal bericht 2628 standaard bericht 8152 vervangen.

Other episodes