Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 String or binary data would be truncated.  [new]
String or binary
Member

Откуда:
Сообщений: 8
Добрый день.

У меня есть хранимая процедура, выглядит примерно так (убрал то, что не влияет на результат)
+ MergeAll
ALTER PROCEDURE [dbo].[MergeAll]
	(@Horizon datetime = '')
AS
BEGIN
SET NOCOUNT ON

IF (@Horizon = '') begin
	set @Horizon  = cast(getdate() as date)
end	

BEGIN TRY
	SET TRANSACTION ISOLATION LEVEL SNAPSHOT;

	insert into T1 (ModifyDate, ID, A, B, C)
	select ModifyDate, ID, A, B, C
	from vwT1
	where Deleted = 0 
	  and ModifyDate >= @Horizon
	  and ID not in (select ID from [Account])

END TRY
BEGIN CATCH
	declare @estate int = ERROR_STATE()
	declare @etext varchar(max) = 'Msg ' + cast(error_number() as sysname)
								+ ', Level ' + cast(error_severity() as sysname)
								+ ', State ' + cast(@estate as sysname)
								+ ', Line ' + cast(error_line() as sysname)
								+ isnull(' (' + error_procedure() + ')', '')
								+ char(13) + char(10)
								+ error_message();
	THROW 50000, @etext, @estate;
END CATCH; 

END


Процедура запускается неким роботом N раз в день. При первом запуске параметр @Horizon = "-3 месяца от текущего момента", при последующих "-1 час".
Периодически (чаще всего - утром, при первом запуске, но иногда и днём, в процессе стандартной работы) получаю ошибку "String or binary data would be truncated.", строка ошибки указывает на "insert ...", причем после возникновения ошибки процедура работать перестаёт.
Из SMS при этом процедура может как успешно выполняться, так и завершаться той же ошибкой.


Сначала проверил очевидное, описание полей таблицы Т1 100% соответствует тому, что возвращает вьюха vwT1.
Эксперементально выяснил, что чтобы ошибка ушла нужно сделать alter procedure MergeAll.
Затем догадался что достаточно exec sp_recompile 'MergeAll'.

Подскажите, на что я нарвался? Что делаю не так? В какую сторону смотреть?


+ select @@version
Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)
Dec 28 2012 20:23:12
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
24 ноя 15, 13:10    [18464074]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
Glory
Member

Откуда:
Сообщений: 104760
String or binary
Подскажите, на что я нарвался? Что делаю не так? В какую сторону смотреть?

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

Сообщение было отредактировано: 24 ноя 15, 13:13
24 ноя 15, 13:12    [18464096]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
String or binary
Member

Откуда:
Сообщений: 8
Логично )

Сообщение выглядит так:
Msg 8152, Level 16, State 14, Line 45 (MergeAll)
String or binary data would be truncated.

Это соответствует 14ой строке примера (insert into T1...).
24 ноя 15, 13:18    [18464154]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1754
Ошибка говорит что вы пытаетесь в текстовое или бинарное поле размерности N положить строку или бинарник размером M, где N < M.
24 ноя 15, 13:24    [18464197]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
Glory
Member

Откуда:
Сообщений: 104760
String or binary
Это соответствует 14ой строке примера (insert into T1...).

И как вы проверяли, что типы и _размеры_ данных select-а соавпдают с типами и _размерами_ T1 ?
24 ноя 15, 13:26    [18464218]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31431
String or binary
Сначала проверил очевидное, описание полей таблицы Т1 100% соответствует тому, что возвращает вьюха vwT1.
Эксперементально выяснил, что чтобы ошибка ушла нужно сделать alter procedure MergeAll.
Затем догадался что достаточно exec sp_recompile 'MergeAll'.

Подскажите, на что я нарвался? Что делаю не так? В какую сторону смотреть?
В общем, выглядит довольно странно.

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

Возможно, переполнение строки происходит в условиях запроса; посмотрите, нет ли во вьюхе какой либо конкатенации строк, например.

В общем, по любому нужно смотреть вьюху, раз вы проверили размеры полей (размеры полей, а не размер данных!), и раз ошибка уходит при перекомпиляции.
24 ноя 15, 13:26    [18464219]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
String or binary
Логично )

Сообщение выглядит так:
Msg 8152, Level 16, State 14, Line 45 (MergeAll)
String or binary data would be truncated.

Это соответствует 14ой строке примера (insert into T1...).


Ищите в этом INSERT строку, которая не влазит по размеру в поле, которому она предназначена.

Например у вас VARCHAR(5), а вы туда вставляете '123456'.
24 ноя 15, 13:43    [18464382]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
String or binary
Member

Откуда:
Сообщений: 8
Так как конкатенаций и пр. во вьюхе нет и она по сути инкапсулирует собой обращение к таблице другой базы, то я убедился что типы и размеры полей в таблице Т1 совпадают с типами и размерами соответствующих полей таблицы источника.

Так же при возникновении ошибки я проверял какие данные есть во вьюхе в момент возникновения ошибки: ничего даже близко приближающегося по размеру к пределу я там не увидел. Более того, данные во вьюхе меняются крайне редко, ошибка возникает чаще.

+ вьюха

binary-полей во вьюхе нет
string-поля A, B
ModifyDate - дата
остальные - int
CREATE VIEW vwT1
AS
SELECT t.ModifyDate
	, t.ID
	, t.A
	, t.B
	, t.Agreement
	, isnull(Agreement.Client, 0) AS Client
FROM SrcDB.dbo.Main AS t 
inner join SrcDB.dbo.MainType as Type on Type.ID = t.MainType
LEFT JOIN SrcDB.dbo.Main AS Agreement ON Agreement.ID = t.Agreement
LEFT JOIN SrcDB.dbo.Client AS Client ON Client.ID = Agreement.Client
WHERE (Type.Code = '123') 
  and Client.ID in (9, 10)
24 ноя 15, 13:51    [18464471]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
String or binary,

Иногда такой случается, если где-то перепутан порядок полей. Что-то не так где-то. Ищите
24 ноя 15, 14:08    [18464644]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
кроме прочего
Guest
String or binary,

THROW принимает nvarchar(2048), а не max
в конкатенации нужно 'Msg ' - первый фрагмент - кастануть к varchar(max)
24 ноя 15, 15:14    [18465179]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
кроме прочего
Guest
not in переписать в not exists
указать схемы у таблиц и вьюх (не ради красоты)
24 ноя 15, 15:16    [18465198]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
String or binary
Сначала проверил очевидное, описание полей таблицы Т1 100% соответствует тому, что возвращает вьюха vwT1.
Эксперементально выяснил, что чтобы ошибка ушла нужно сделать alter procedure MergeAll.
Затем догадался что достаточно exec sp_recompile 'MergeAll'.

Подскажите, на что я нарвался? Что делаю не так? В какую сторону смотреть?
А структура таблиц, входящих во вьюху или процедуру, случайно, не меняется?
24 ноя 15, 17:10    [18466230]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
String or binary
Member

Откуда:
Сообщений: 8
кроме прочего: спасибо за замечания

Serg_77m: нет, структура неизменна
24 ноя 15, 17:45    [18466438]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31431
String or binary
я убедился что типы и размеры полей в таблице Т1 совпадают с типами и размерами соответствующих полей таблицы источника.
А поле ModifyDate у вас не varchar?

Вы бы привели структуру таблиц источника и приёмника.

Чудес не бывает, слишком странная была бы бага
24 ноя 15, 18:12    [18466572]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
String or binary
Member

Откуда:
Сообщений: 8
Чудес не бывает, бывают кривые руки )

+ таблица-приёмник
CREATE TABLE T1 (
	[ID] [int] NOT NULL,
	[A] [varchar](128) NOT NULL,
	[A] [varchar](850) NOT NULL,
	[Agreement] [int] NOT NULL,
	[Client] [int] NOT NULL,
	[ModifyDate] [datetime] NOT NULL
) 


Таблицы-источники не покажу, уж больно там всего много. Сейчас проверил ещё раз, отличие лишь одно, размер поля для А [varchar](80) NOT NULL, остальное идентично.

В любом случае - спасибо за консультации.
24 ноя 15, 19:13    [18466906]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
String or binary,

Для ловли ошибки откройте курсорный цикл по вьюшке, внутри курсорного цикла делайте построчную вставку, завернутую в try-catch, в catch ловите строку, которая вызывают указанную ошибку, и подробно рассматривайте, что там за данные (это всё, разумеется, разово только для выявления причины ошибки).
25 ноя 15, 09:01    [18468799]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Сон Веры Павловны,
А просто селект с длиной полей сделать нельзя?
25 ноя 15, 09:07    [18468825]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31431
Mike_za
Сон Веры Павловны,
А просто селект с длиной полей сделать нельзя?
Я вот не понял последний пост String or binary
Это он написал, что решил проблему, увидев несоответствие длины полей?
Или не решил проблему, а пост неинформативный по теме топика, просто "поговорить"?
25 ноя 15, 10:04    [18469054]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31431
Сон Веры Павловны
String or binary,

Для ловли ошибки откройте курсорный цикл по вьюшке, внутри курсорного цикла делайте построчную вставку, завернутую в try-catch, в catch ловите строку, которая вызывают указанную ошибку, и подробно рассматривайте, что там за данные (это всё, разумеется, разово только для выявления причины ошибки).
Да нужно просто вывести на экран вьюху, определения таблиц, запрос вставки, и посмотреть на это.

Ну не может быть, что вставка из поля varchar(100) в поле varchar(100) генерит ошибку "String or binary data would be truncated", какие бы там не лежали данные.
25 ноя 15, 10:06    [18469068]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
String or binary
Member

Откуда:
Сообщений: 8
alexeyvg
Я вот не понял последний пост String or binary
Это он написал, что решил проблему, увидев несоответствие длины полей?
Извините за неточность формулировок. Нет, существенные несоответствия длин полей отсутствуют (то что поля в источнике меньше чем поля в приёмнике - не критично). Проблема всё ещё со мной.

alexeyvg
Да нужно просто вывести на экран вьюху, определения таблиц, запрос вставки, и посмотреть на это.
Сделано. Всё выглядит корректно (и, напомню, в 99,9% случаев всё работает).

alexeyvg
Ну не может быть, что вставка из поля varchar(100) в поле varchar(100) генерит ошибку "String or binary data would be truncated", какие бы там не лежали данные.
Именно. Ошибка явно наведённая.
Ведь чтобы убрать проблему я просто делаю sp_recompile, не трогая данные.
25 ноя 15, 10:54    [18469372]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
выглядит примерно так
Guest
String or binary,

так хранимка же сама данные постоянно трогает
скриншот вот этого 18464154 приведите пожалуйста чтоб прям вкладка студии с сообщениями и всё что в ней написано
25 ноя 15, 11:10    [18469517]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31431
String or binary
Это соответствует 14ой строке примера (insert into T1...).
А вы в этом убедились? Бывает, неправильно показывается номер строки. Поставьте print отладочный до и после.
25 ноя 15, 11:16    [18469572]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31431
alexeyvg
String or binary
Это соответствует 14ой строке примера (insert into T1...).
А вы в этом убедились? Бывает, неправильно показывается номер строки. Поставьте print отладочный до и после.
Далее, триггер ещё может быть, или, например, вычисляемое поле (может, обработчик неправильно формирует текст ошибки?).

Запустите профайлер с "входом внутрь", выведите колонку Error, смотрите все команды, всю цепочку от запуска до появления ошибки.
25 ноя 15, 11:19    [18469595]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31431
String or binary
Ведь чтобы убрать проблему я просто делаю sp_recompile, не трогая данные.
Это как раз нормально, это как раз бывает при несоответствии размеров полей.
Ведь план выполнения может быть такой, что сначала делается подготовка данных, а потом уже наложение условий.
Соответственно, при разных планах, но одинаковых данных (и одинаковом результате) ошибка будет то проявляться, то нет.
25 ноя 15, 11:22    [18469615]     Ответить | Цитировать Сообщить модератору
 Re: String or binary data would be truncated.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31431
String or binary
alexeyvg
Да нужно просто вывести на экран вьюху, определения таблиц, запрос вставки, и посмотреть на это.
Сделано. Всё выглядит корректно
"Выглядит"...
Нужно точно сделать, не взглядом пройтись.

Открыть текст INSERT и определение таблицы-приёмника.
Открыть определение вьюхи.

Составить таблицу - поля таблицы-приёмника с типами, справа - имена соответствующих полей из вьюхи. Элементарно люди путают порядок полей или имена. (я вот вчера разбирался - данные не сходятся, оказывается, перепутал местами 2 поля - ИД на разные справочники)

Далее, смотря на вьюху, открыть таблицы-источники, и скопировать описания и типы соотв. полей. Внимательно, не путая таблицы.

А то вот ваш код, что это такое?
String or binary
CREATE TABLE T1 (
	[ID] [int] NOT NULL,
	[A] [varchar](128) NOT NULL,
	[A] [varchar](850) NOT NULL,
	[Agreement] [int] NOT NULL,
	[Client] [int] NOT NULL,
	[ModifyDate] [datetime] NOT NULL
) 
У вас же не 2 поля с одним именем в таблице???
25 ноя 15, 11:29    [18469675]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить