2016-10-18 28 views
2

20の列のあるテーブルから別のテーブルに行& 300行のデータを挿入しています。ミッド実行、私はエラー一般的なt-sqlエラー「文字列またはバイナリデータを生成するソース値が切り捨てられますか?

メッセージ8152、レベル16、状態14、行1
文字列またはバイナリデータが切り捨てられます取得します。

私はエラーの意味を知っていますが、どのような値、または少なくともどの行がこのエラーを生成しているのでしょうか?

Insert into Employee (col1, col2, col3,..., col20) 
select col1, col2, col3,..., col20 from TEMP_EMPL 

ありがとう:

INSERT文は、このような簡単なものです。

+0

通知方法はありません。 [this](https://connect.microsoft.com/SQLServer/feedback/details/339410/please-fix-the-string-or-binary-data-would-be-truncated-message-to)に投票してください。 -give-the-column-name)機能!これを絞り込むには、各列に対して 'max(len(col1))'をチェックして不良列を見つけ、 'len(col1)> [max allowable]'行を見つける行を見つけてください。 – Blorgbeard

+0

これは長すぎる文字列になる可能性が高いです。すべての値の文字列の長さを「測定」する方法がありますか?あなたが実際に 'INSERT'を試みるまで待っているのであれば、これまでに得られることは、一般的なエラーです。 – SlimsGhost

+0

これはMSのこれまでの最悪の問題です。彼らは明らかに実行時にどの列がこれを引き起こすかを知っています...これを修正するための接続項目が何年もありましたが、それらは無視し続けています。これを把握するには、データを手動で見る必要があります。 UGH !!!! –

答えて

0

this answerによれば、直接可能ではありません。このエラーメッセージに列の名前を追加するために、古いsupport ticketもあります。

あなたがデータを挿入し、データの現在の最大長さと列の最大長さを比較

set ANSI_WARNINGS OFF 

を設定することにより、このエラーを無効にすることができた理由を見つけるために。その後、最大値まで満たされた列に検索を制限することができます。たとえば、the following codeを使用できます(@TableNameと@TableSchemaを変更するだけです)。

DECLARE @TableName sysname = 'test', @TableSchema sysname = 'dbo' 
DECLARE @SQL NVARCHAR(MAX) 

SELECT @SQL = STUFF((SELECT 
' 
UNION ALL 
select ' + QUOTENAME(Table_Name,'''') + ' AS Table_Name, ' + 
QUOTENAME(Column_Name,'''') + ' AS ColumnName, MAX(' + 
CASE WHEN DATA_TYPE IN ('XML','HierarchyID','Geometry','Geography','text','ntext') 
THEN 'DATALENGTH(' ELSE 'LEN(' END + QUOTENAME(Column_Name) + 
')) as [Max Length], ' + QUOTENAME(C.DATA_TYPE,'''') + ' AS Data_Type, ' + 
CAST(COALESCE(C.CHARACTER_MAXIMUM_LENGTH, C.NUMERIC_SCALE,0) AS VARCHAR(10)) + 
' AS Data_Width FROM ' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(Table_Name) 
FROM INFORMATION_SCHEMA.COLUMNS C 
WHERE TABLE_NAME = @TableName 
AND table_schema = @TableSchema 
--AND DATA_TYPE NOT IN ('XML','HierarchyID','Geometry','Geography') 
ORDER BY COLUMN_NAME 
FOR XML PATH(''),Type).value('.','varchar(max)'),1,11,'') 
--print @SQL 

EXECUTE (@SQL) 
関連する問題