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 varchar
enz. 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 @trackingItems1
kolom 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.