Рядок або двійкові дані будуть усічені. Заява припинена


78

Я зіткнувся з деякою проблемою з сервером SQL, це функція, яку я створив:

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;

Коли я пишу запит, щоб використовувати цю функцію, як наступну, це отримує помилку

Рядок або двійкові дані будуть усічені. Заява припинена

Як я можу вирішити цю проблему?

select * from testing1(2)

Це спосіб створення таблиці

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

17
Це просто означає, що ви вставляєте значення, яке перевищує максимально допустиме значення. Наприклад, стовпець може містити до 5 символів, але ви вставляєте 10-символьний рядок.
Джон Ву

@JW, але в мою таблицю включено значення 2 для ціни, а тип даних насправді такий самий (наприклад: int)
user2098512

Також способом виклику функції є вибір [dbo] .testing1 (2) з імені таблиці
DevelopmentIsMyPassion

@AshReva, коли я пробую вашу пропозицію, він отримує цю помилку "Не вдається знайти ні стовпець" dbo ", ні визначену користувачем функцію, або сукупність" dbo.testing1 ", або назва неоднозначна." але я можу підтвердити, що у мене вже є цей метод у моїй таблично-визначеній функції
user2098512

1
Чи можете ви включити визначення схеми для таблиці запасів?
Кейн

Відповіді:


69

Коли ви визначаєте varcharі т.д. без довжини, за замовчуванням 1.

Коли n не вказано у визначенні даних або в заяві про декларацію змінної, довжина за замовчуванням дорівнює 1. Коли n не вказано за допомогою функції CAST, довжина за замовчуванням становить 30.

Отже, якщо ви очікуєте від 400 байт у @trackingItems1стовпці stock, використовуйте nvarchar(400).

В іншому випадку ви намагаєтесь помістити> 1 символ у nvarchar(1)= fail

Як коментар, це також невдале використання функції табличного значення, оскільки це "багатозначна операція". Це можна написати так, і воно буде працювати краще

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

Звичайно, ви можете просто використати звичайний оператор SELECT ..


39

Максимальна довжина цільового стовпця коротша за значення, яке ви намагаєтесь вставити.

Клацніть правою кнопкою миші на таблиці в диспетчері SQL і перейдіть до пункту "Дизайн", щоб візуалізувати структуру таблиці та визначення стовпців.

Редагувати:

Спробуйте встановити довжину вкладишів nvarchar, яка однакова або менша, ніж визначена у вашій таблиці.


для мене проблема була з довжиною стовпця, тому зміна з nvarchar(50)на ntextна sql sever, вирішує проблему, надія допомагає комусь
Shaiju T

@stom, ви завжди повинні намагатися використовувати якнайменшу довжину для своїх даних. Це робить ваші столики якомога меншими та швидшими, а також демонструє наміри. Якщо комусь потрібно буде проіндексувати або перенести ваш db за кілька років, йому доведеться з’ясувати, чому таблиці розроблені так, як вони. Тим не менш, якщо ви хочете "необмежений" текст у полі, ntext є життєздатним рішенням.
OakNinja

дякую за пораду щодо продуктивності, зараз я зберігаю посилання на веб-сайти, а деякі з них довгі, тому я вибираю ntext.
Shaiju T

1
@stom Ви можете встановити для нього значення nvarchar (2083), що є максимальною довжиною для Internet Explorer. Таким чином ви максимізуєте продуктивність та сумісність.
OakNinja

ya nvarchar(2083) - найкращий тип стовпця для URL-адреси звідси , дякую.
Shaiju T

19

У моєму випадку я отримував цю помилку, оскільки моя таблиця мала

varchar(50)

але я вводив рядок довжиною 67 символів, що призвело до помилки. Змінюючи його на

varchar(255)

вирішено проблему.


:) Зміна на varchar (some_value) виправила мою проблему.
Naveen Kumar V

8

Вкажіть розмір товару та складу, як у [dbo]. [Тестування1] ФУНКЦІЯ

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

) 

Оскільки в MSSQL лише приказка лише nvarchar дорівнює nvarchar (1), отже значення стовпця з таблиці запасів усічені


1

SQL Server 2016 SP2 CU6 та SQL Server 2017 CU12 ввели прапор трасування 460, щоб повернути деталі попереджень про усічення. Ви можете ввімкнути його на рівні запиту або на рівні сервера.

Рівень запиту

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

Рівень сервера

DBCC TRACEON(460, -1);
GO

З SQL Server 2019 ви можете ввімкнути його на рівні бази даних:

ALTER DATABASE SCOPED CONFIGURATION 
SET VERBOSE_TRUNCATION_WARNINGS = ON;

Старе вихідне повідомлення:

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

Новим вихідним повідомленням є:

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‘'.

У майбутньому випуску SQL Server 2019 повідомлення 2628 замінить повідомлення 8152 за замовчуванням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.