Строка или двоичные данные будут проигнорированы. Заявление было прекращено
Я столкнулся с некоторыми проблемами с 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);
Ответы
Ответ 1
Когда вы определяете varchar
и т.д. без длины, по умолчанию используется 1.
Если n не указано в определении объявления или объявлении объявления переменной, длина по умолчанию равна 1. Когда n не указывается с помощью функции CAST, длина по умолчанию составляет 30.
Итак, если вы ожидаете 400 символов в столбце @trackingItems1
от stock
, используйте nvarchar(400)
.
В противном случае вы пытаетесь поместить > 1 символ в nvarchar(1)
= fail
В качестве комментария это плохое использование функции значений таблиц, потому что это "multi statement". Он может быть написан так и будет работать лучше
ALTER FUNCTION [dbo].[testing1](@price int)
RETURNS
AS
SELECT ta.item, ta.warehouse, ta.price
FROM stock ta
WHERE ta.price >= @price;
Конечно, вы можете просто использовать обычный оператор SELECT..
Ответ 2
Максимальная длина целевого столбца короче значения, которое вы пытаетесь вставить.
Щелкните правой кнопкой мыши таблицу в диспетчере SQL и перейдите в "Дизайн", чтобы визуализировать структуру таблиц и определения столбцов.
Edit:
Попробуйте установить длину в ваших вставках nvarchar, то же самое или меньше, чем указано в вашей таблице.
Ответ 3
Укажите размер элемента и склада, как в [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
)
Так как в MSSQL только утверждение только nvarchar равно nvarchar (1), следовательно, значения столбца из таблицы запаса усекаются
Ответ 4
В моем случае я получал эту ошибку, потому что моя таблица имела
varchar(50)
но я вводил длинную строку длиной 67 символов, что привело к ошибке. Изменение его на
varchar(255)
исправлена проблема.