Подтвердить что ты не робот

Строка или двоичные данные будут проигнорированы. Заявление было прекращено

Я столкнулся с некоторыми проблемами с 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);
4b9b3361

Ответ 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)

исправлена ​​проблема.