How to fix Error 4867 on Windows Server 2025 / Windows 11

Troubleshooting Guide: SQL Server Error 4867 – Bulk Load Data Conversion Error (Overflow)

Why This Error Happens

Error 4867 occurs when SQL Server’s BULK INSERT, BCP, or OPENROWSET(BULK...) operation encounters a source data value that exceeds the storage capacity of the target column’s defined data type. This commonly happens when the source file (CSV, flat file) contains numeric values, strings, or dates that are wider or larger than the destination schema allows, or when the format file (.fmt or .xml) incorrectly maps column lengths/precision. It can also stem from mismatched collation or implicit conversion issues between the source data type and the target table’s column definition, particularly with DECIMAL, INT, or fixed-length CHAR/VARCHAR fields.

Step-by-Step Resolution Guide

Step 1: Identify the Offending Row and Column

  • Note the exact row number (%d) reported in the error message.
  • Open the source file (e.g., C:\ImportData\source.csv) and navigate to that specific row using a text editor or PowerShell: Get-Content C:\ImportData\source.csv | Select-Object -Index (row-1).
  • Cross-reference the row’s field lengths against the target table schema using sp_help 'YourTableName'; in SQL Server Management Studio (SSMS).

Step 2: Correct the Target Table Schema or Format File

  • If the column is too small (e.g., DECIMAL(5,2) but source has DECIMAL(10,4)), alter the table: ALTER TABLE YourTable ALTER COLUMN YourColumn DECIMAL(18,4);.
  • If using a format file, verify the .fmt file paths (typically stored in C:\BulkImport\Formats\) have correct HOST_COLUMN length and precision values matching the source data.
  • For string truncation issues, increase VARCHAR/NVARCHAR length definitions to accommodate the longest expected value.

Step 3: Validate Source Data for Rogue Entries

  • Scan the source file for unexpected characters, extra delimiters, or malformed numeric values (e.g., commas in numbers, scientific notation) that cause overflow during type casting.
  • Use a staging table with wider, more permissive data types (e.g., VARCHAR(255) or NVARCHAR(MAX)) as an intermediate landing zone before transforming data into the final strict-typed table.
  • Re-run the import with the MAXERRORS and ERRORFILE options to capture all problematic rows at once: BULK INSERT YourTable FROM 'C:\ImportData\source.csv' WITH (ERRORFILE = 'C:\ImportData\errors.log', MAXERRORS = 50);.

Step 4: Adjust Batch Size and Field Terminators

  • Verify that FIELDTERMINATOR and ROWTERMINATOR settings in your BULK INSERT statement match the actual file encoding (UTF-8 vs. ANSI) to prevent column data from shifting into the wrong field.
  • Reduce BATCHSIZE to isolate whether the overflow is caused by a transaction log buffer issue rather than a pure data type mismatch.

Alternative or Verification Steps

  • Verify the Fix: Re-run the bulk load operation and query the destination table row count (SELECT COUNT(*) FROM YourTable;) to confirm it matches the source file’s expected row count without triggering Error 4867.
  • Alternative Solution: If schema changes are not permitted, use the KEEPNULLS and explicit CAST/CONVERT logic within a view or a pre-processing PowerShell script to sanitize data (truncating or rounding oversized values) before it enters the BULK INSERT pipeline.