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


Я зіткнувся з деякими проблемами з 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);

60
2018-02-22 07:57


походження


Це просто означає, що ви вставляєте значення, яке перевищує максимально дозволене значення. Наприклад, стовпець може містити до 5 символів, але ви вставляєте 10-символьний рядок. - John Woo
@JW, але в моєму столі є значення 2 для ціни, а тип даних насправді однаковий (наприклад: int) - user2098512
Також спосіб виклику функції вибирає [dbo] .testing1 (2) з назви табуляції - DevelopmentIsMyPassion
@AshReva, коли я пробую вашу пропозицію, він отримає цю помилку "Не можу знайти колонці" dbo "або визначену користувачем функцію або агрегат" dbo.testing1 ", або ім'я неоднозначне". але я можу підтвердити, що цей метод в моїй табличній функції вже є - user2098512
Чи можете ви включити визначення схеми стокового столу? - Kane


Відповіді:


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

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

Отже, якщо ви очікуєте 400 символів у @trackingItems1 колонка від stock, використовувати nvarchar(400).

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

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

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

Звичайно, ви могли б просто використовувати звичайне оператор SELECT ..


49
2018-02-22 08:06





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

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

Редагувати:

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


33
2018-02-22 08:05



для мене це питання було з довжиною стовпця, так що змінити з nvarchar(50) до ntext у sql sever, вирішує проблему, сподіваюся, допоможе комусь - stom
@stom ви завжди повинні намагатись використовувати якнайдовшу довжину даних. Це робить ваші таблиці максимально малими та швидкими, а також демонструє намір. Якщо хтось потребує індексування або міграції вашої д.б. через кілька років, їм доведеться з'ясувати, чому таблиці формуються так, як вони є. Тим не менш, якщо ви хочете "необмежений" текст у полі, ntext є життєздатним рішенням. - OakNinja
Дякую за пораду, надану на продуктивність, зараз я зберігаю посилання на веб-сайт, а деякі - довго, тому я вибираю ntext. - stom
@stom Ви можете встановити його на nvarchar (2083), який є максимальною довжиною для Internet Explorer. Таким чином, ви максимізуєте продуктивність і сумісність. - OakNinja
я nvarchar(2083)  найкращий тип стовпця для URL-адреси з тут, Дякую. - stom


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

varchar(50)

але я вводив 67-символьний довгий рядок, що призвело до цієї помилки. Зміна його на

varchar(255)

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


11
2017-07-20 08:17



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


Вкажіть розмір для позиція і склад як у [dbo]. [testing1] ФУНКЦІЯ

@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), отже, значення стовпця з запас стіл зрізаний


7
2018-02-22 08:09



Спасибі всім, я вирішив мою проблему ~~ дуелі до фільтрації спаму, не можу tq всім тут - user2098512