msg 8152 уровень 16 состояние 2 строка или двоичные данные будут обрезаны - PullRequest
0 голосов
/ 28 сентября 2018

Я получаю эту ошибку при выполнении процедуры

Сообщение 8152, уровень 16, состояние 2, процедура SP_xxxxx, строка 92 Строка или двоичные данные будут усечены.

Я создал временную таблицу, в которую я буду загружать данные из основной таблицы один раз в процедуре, и я буду использовать эту таблицу, а не основную таблицу, так как основная таблица имеет огромный объем данных и много ненужных столбцов.

Когда я запускаю приведенный ниже код из sql server management studio, то ошибки не возникает, но когда я запускаю этот код из процедуры, появляется сообщение об ошибке выше.

Insert into abc_TMP // tmp for procedure with required columns
Select 
    Item,
    Description,
    size,
    qty,
    stock,
    Time ,
    Measure

    from abc   // main table has many columns

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Я подозреваю, что вы смотрите неправильную строку кода в сохраненном процессе.

Когда вы открываете процесс, то есть ALTER..., у вас есть заголовок в сохраненном процессе.это выкинет номер строки.

Если вы запустите это, заменив proc_name на имя вашей процедуры:

sp_helptext proc_name

Это даст вам код, который процедура на самом деле будет запускать,с точными номерами строк, если вставить его в новое окно.

Тогда вы увидите, где происходит настоящая ошибка.

Если вы хотите простой способ доказать эту теорию, поместитесвязка Print 'some sql 1', Print 'some sql 2' строк вокруг кода, который, по вашему мнению, вызывает ошибку, и посмотрите, что выводится при возникновении ошибки.

0 голосов
/ 28 сентября 2018

Один из способов проверить эту проблему - увидеть длину каждого значения

Предположим, у вас есть таблица, подобная приведенной ниже

create table t
(
col1 varchar(10),
col2 varchar(10)
)

Вставки в таблицу завершатся неудачно, если вы попытаетесь вставитьболее 10 символов, если вы попытаетесь вставить их в пакет, вы не получите ошибочное значение.

Поэтому вам необходимо проверить его длину, как показано ниже, перед вставкой

;with cte
as
(
select 
len(col1) as col1,
len(Col2) as col2
from table
)
select * from cte where col2>10

В Microsoft поступило несколько запросов на улучшение сообщения об ошибке, и они наконец исправили эту проблему в SQL2019.

Теперь вы можете получить точное значение, вызывающее проблему

enter image description here

Ссылки:
https://voiceofthedba.com/2018/09/26/no-more-mysterious-truncation/

...