我有应用程序,只需单击即可插入多个表格。这些表有近100-150列。
它工作正常,但有时列中的任何人都会使错误字符串或二进制数据被截断。我知道错误原因,但我想知道这个问题的原因中的哪一列。
Msg 8152,Level 16,State 13,Line 1
字符串或二进制数据将被截断。
是否可以在SQL服务器中识别?由于我的申请是生产方面。我无法重现错误。
答案 0 :(得分:4)
使用VARCHAR(MAX)
作为列的数据类型将数据导入新表。然后,您可以使用DATALENGTH
来获取每列的最大大小。
SELECT MAX(DATALENGTH(col1)) AS col1, MAX(DATALENGTH(col2)) AS col2, etc.
FROM newTable
这将告诉您哪些列超出了列的大小。
答案 1 :(得分:1)
您可以查看MSDN blog:
declare @table_name varchar(200)
set @table_name = 'Branch'
declare @max_length_default int, @column varchar(50), @max_length int, @max_length_string varchar(10)
create table #temp_table (column_name varchar(50), max_length int, max_length_default int)
declare @column_id int, @max_column_id int
select @column_id = min(b.column_id), @max_column_id = max(b.column_id) from sys.tables a, sys.columns b where a.[name] = @table_name and a.object_id = b.object_id --and b.system_type_id in ( 231, 167 )
-- select @column_id, @max_column_id
declare @command varchar(2000)
while(@column_id <= @max_column_id)
begin
set @column = null
select @column = b.name, @max_length_default = b.max_length from sys.tables a, sys.columns b where a.[name] = @table_name and a.object_id = b.object_id --and b.system_type_id in ( 231, 167 )
and b.column_id = @column_id
--select @column, @max_length_default
if( @column is not null )
begin
set @command = 'insert into #temp_table(column_name, max_length, max_length_default) select ''' + @column + ''', max(len(cast([' + @column + ']as varchar(8000)))),' + cast(@max_length_default as varchar(5)) + ' from ' + @table_name + ' where [' + @column + '] is not null'
--select @command
exec(@command)
end
set @column_id = @column_id + 1
end
select * from #temp_table
drop table #temp_table