Как преодолеть это?Строка или двоичные данные будут усечены. в sql-сервере
У меня есть инструкции для больших таблиц. в этих таблицах было много столбцов.
Есть ли простой способ найти столбец, который вызывает ошибку выше?
Как преодолеть это?Строка или двоичные данные будут усечены. в sql-сервере
У меня есть инструкции для больших таблиц. в этих таблицах было много столбцов.
Есть ли простой способ найти столбец, который вызывает ошибку выше?
Самый простой способ - увеличить длину столбца, который дает вам ошибку «строковые или двоичные данные будут усечены. В sql-сервере».
Теперь, чтобы найти какой столбец дает эту ошибку можно проверить How to find what column caused the String or binary data would be truncated message
Первое, что нам нужно знать, какие столбцы в таблице, являются (п) символов или (п) VARCHAR
select column_name
from information_schema.columns
where table_name = 'temp'
and data_type in('varchar','char','nvarchar','nchar')
Выход:
column_name
————–
Col1
Col2
Col3
Col4
Col5
Это было легко, теперь мы хотим знать максимальную длину данных в каждом столбце
declare @sql varchar(8000)
select @sql = 'select 0 as _col0 ,'
select @sql += 'max(len(' + column_name+ ')) AS ' + column_name + ','
from information_schema.columns
where table_name = 'temp'
and data_type in('varchar','char','nvarchar','nchar')
select @sql = left(@sql,len(@sql) -1)
select @sql +=' into MaxLengths from temp'
--select @sql -debugging so simple, a caveman can do it
exec (@sql)
Этот код в основном создает и запускает следующую
select 0 as _col0 ,
max(len(Col1)) AS Col1,
max(len(Col2)) AS Col2,
max(len(Col3)) AS Col3,
max(len(Col4)) AS Col4,
max(len(Col5)) AS Col5
into MaxLengths
from temp
Если посмотреть в таблицу MaxLengths мы увидим следующее
select * from MaxLengths
_col0 Col1 Col2 Col3 Col4 Col5
---------------------------------------------------
0 13 20 6 4 15
Далее, чтобы выяснить, является то, что максимальная длина самого столбца находится в таблице, которую мы хотим вставить в Заполните следующий вопрос:
select character_maximum_length,column_name
from information_schema.columns
where table_name = 'TestTrunc'
and data_type in('varchar','char','nvarchar','nchar')
Результат
character_maximum_length column_name
--------------------------------------------
10 Col1
15 Col2
20 Col3
3 Col4
10 Col5
Мы снова сделать это динамически и вставить значения в другую таблицу
declare @sql varchar(8000)
select @sql = 'select 0 as _col0, '
select @sql += '' + convert(varchar(20),character_maximum_length)+ ' AS ' + column_name + ','
from information_schema.columns
where table_name = 'TestTrunc'
and data_type in('varchar','char','nvarchar','nchar')
select @sql = left(@sql,len(@sql) -1)
select @sql +=' into TempTrunc '
--select @sql -debugging so simple, a caveman can do it
exec (@sql)
Теперь мы можем увидеть, что мы имеем в двух таблицах
select 'TempTrunc' as TableNAme,* from TempTrunc
union all
select 'MaxLengths' as TableNAme,* from MaxLengths
TableNAme _col0 Col1 Col2 Col3 Col4 Col5
-------------------------------------------------------------
TempTrunc 0 10 15 20 3 10
MaxLengths 0 13 20 6 4 15
Как вы можете видеть, что все столбцы, за исключением Col3, вызовут проблему усечения Конечно, мы хотим что-то сделать как это, это покажет нам, какие столбцы имеют проблемы усечения
select case when t.col1 > tt.col1 then 'truncation' else 'no truncation' end as Col1,
case when t.col2 > tt.col2 then 'truncation' else 'no truncation' end as Col2,
case when t.col3 > tt.col3 then 'truncation' else 'no truncation' end as Col3,
case when t.col4 > tt.col4 then 'truncation' else 'no truncation' end as Col4,
case when t.col5 > tt.col5 then 'truncation' else 'no truncation' end as Col5
from MaxLengths t
join TempTrunc tt on t._col0 = tt._col0
Col1 Col2 Col3 Col4 Col5
------------------------------------------------------------------------------------
truncation truncation no truncation truncation truncation
Благодарим за ответ –
@GiriPrasad : - Добро пожаловать, и если ответ помог вам, тогда примите это как ответ :) –
Я видел это решение раньше. Но он не подходит для временных таблиц, а также я попросил простое решение yaar –
Я полагаю, вы уже знаете, что это связано с установкой значения строки в столбец с меньшим размером Вы можете запросить столбцы таблицы из знаковых имен таблиц и сравнить их.
select
OBJECT_NAME(object_id),
name,
max_length,
precision,
scale
from sys.columns where object_id in (
select object_id from sys.tables where name in ('tbl','Emp')
)
благодарим за ответ –
проголосовать за это исправление https://connect.microsoft.com/SQLServer/feedback/details/339410/please-fix-the-string-or-binary-data-would-be-truncated-message-to-give-the-column-name – ughai