63

I have a C# code which does lot of insert statements in a batch. While executing these statements, I got "String or binary data would be truncated" error and transaction roledback.

To find out the which insert statement caused this, I need to insert one by one in the SQLServer until I hit the error.

Is there clever way to findout which statement and which field caused this issue using exception handling? (SqlException)

GEOCHET
  • 20,623
  • 15
  • 71
  • 98
  • You'd think .Net would add an inner exception for an error like this, with offending table & column information. Alas, no. SMH. – pwrgreg007 Nov 23 '20 at 23:31

12 Answers12

80

In general, there isn't a way to determine which particular statement caused the error. If you're running several, you could watch profiler and look at the last completed statement and see what the statement after that might be, though I have no idea if that approach is feasible for you.

In any event, one of your parameter variables (and the data inside it) is too large for the field it's trying to store data in. Check your parameter sizes against column sizes and the field(s) in question should be evident pretty quickly.

Adam Robinson
  • 171,726
  • 31
  • 271
  • 330
  • This *is possible*, see my [answer below](http://stackoverflow.com/questions/779082/sqlexception-string-or-binary-data-would-be-truncated/16533835#16533835) – profMamba Feb 28 '17 at 08:49
  • In my case, the parameter value to be stored was too large for the DB table field – Umar T. Mar 26 '18 at 10:39
  • [Now supported in > 2016 SP2](https://stackoverflow.com/a/52482685/185123) – spottedmahn Sep 10 '19 at 21:10
25

This type of error occurs when the datatype of the SQL Server column has a length which is less than the length of the data entered into the entry form.

Pete Carter
  • 2,661
  • 3
  • 21
  • 34
Jasmin Chauhan
  • 261
  • 3
  • 2
8

this type of error generally occurs when you have to put characters or values more than that you have specified in Database table like in that case: you specify transaction_status varchar(10) but you actually trying to store _transaction_status which contain 19 characters. that's why you faced this type of error in this code

jaideep
  • 1,541
  • 16
  • 19
5

Generally it is that you are inserting a value that is greater than the maximum allowed value. Ex, data column can only hold up to 200 characters, but you are inserting 201-character string

ismail baig
  • 784
  • 2
  • 9
  • 34
4
BEGIN TRY
    INSERT INTO YourTable (col1, col2) VALUES (@val1, @val2)
END TRY
BEGIN CATCH
    --print or insert into error log or return param or etc...
    PRINT '@val1='+ISNULL(CONVERT(varchar,@val1),'')
    PRINT '@val2='+ISNULL(CONVERT(varchar,@val2),'')
END CATCH
KM.
  • 95,355
  • 33
  • 167
  • 203
  • This assumes he's using something greater than MS SQL 2000 though ;) – Nick DeVore Apr 22 '09 at 21:04
  • @Nick DeVore, the question is vague, doesn't explain the context, and leave a lot to guess at. it does ask for "exception handling". – KM. Apr 22 '09 at 21:12
  • Yes, but he says SqlException, which I would assume to be System.Data.SqlClient.SqlException ;) – Adam Robinson Apr 22 '09 at 21:14
  • @Adam Robinson, but if SqlException is what he wanted, he could have looked up the syntax himself, I think the question was asked because they were looking for ideas to address the problem. – KM. Apr 23 '09 at 12:43
3
  1. Get the query that is causing the problems (you can also use SQL Profiler if you dont have the source)
  2. Remove all WHERE clauses and other unimportant parts until you are basically just left with the SELECT and FROM parts
  3. Add WHERE 0 = 1 (this will select only table structure)
  4. Add INTO [MyTempTable] just before the FROM clause

You should end up with something like

SELECT
 Col1, Col2, ..., [ColN]
INTO [MyTempTable]
FROM
  [Tables etc.]
WHERE 0 = 1

This will create a table called MyTempTable in your DB that you can compare to your target table structure i.e. you can compare the columns on both tables to see where they differ. It is a bit of a workaround but it is the quickest method I have found.

profMamba
  • 978
  • 1
  • 14
  • 29
3

It depends on how you are making the Insert Calls. All as one call, or as individual calls within a transaction? If individual calls, then yes (as you iterate through the calls, catch the one that fails). If one large call, then no. SQL is processing the whole statement, so it's out of the hands of the code.

CodeMonkey1313
  • 14,477
  • 17
  • 71
  • 109
1

It could also be because you're trying to put in a null value back into the database. So one of your transactions could have nulls in them.

Fandango68
  • 3,464
  • 2
  • 32
  • 54
0

With Linq To SQL I debugged by logging the context, eg. Context.Log = Console.Out Then scanned the SQL to check for any obvious errors, there were two:

-- @p46: Input Char (Size = -1; Prec = 0; Scale = 0) [some long text value1]
-- @p8: Input Char (Size = -1; Prec = 0; Scale = 0) [some long text value2]

the last one I found by scanning the table schema against the values, the field was nvarchar(20) but the value was 22 chars

-- @p41: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [1234567890123456789012]

0

In our own case I increase the sql table allowable character or field size which is less than the total characters posted from the front end. Hence that resolve the issue.

0

Most of the answers here are to do the obvious check, that the length of the column as defined in the database isn't smaller than the data you are trying to pass into it.

Several times I have been bitten by going to SQL Management Studio, doing a quick:

sp_help 'mytable'

and be confused for a few minutes until I realize the column in question is an nvarchar, which means the length reported by sp_help is really double the real length supported because it's a double byte (unicode) datatype.

i.e. if sp_help reports nvarchar Length 40, you can store 20 characters max.

Chris Amelinckx
  • 3,954
  • 2
  • 18
  • 19
0

Simply Used this: MessageBox.Show(cmd4.CommandText.ToString()); in c#.net and this will show you main query , Copy it and run in database .