2015-06-05 5 views
3

Как преодолеть это?Строка или двоичные данные будут усечены. в sql-сервере

У меня есть инструкции для больших таблиц. в этих таблицах было много столбцов.

Есть ли простой способ найти столбец, который вызывает ошибку выше?

+0

проголосовать за это исправление 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

ответ

2

Самый простой способ - увеличить длину столбца, который дает вам ошибку «строковые или двоичные данные будут усечены. В 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 

Source

+1

Благодарим за ответ –

+0

@GiriPrasad : - Добро пожаловать, и если ответ помог вам, тогда примите это как ответ :) –

+0

Я видел это решение раньше. Но он не подходит для временных таблиц, а также я попросил простое решение yaar –

1

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

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') 
) 
+0

благодарим за ответ –