2010-06-07 59 views
6

Tenemos un problema muy extraño con una base de datos que se ha movido de la etapa a la producción.Sql Excepción: Error al convertir el tipo de datos numérico a numérico

La primera vez que se movió la base de datos fue separando, copiando y volviendo a conectar, la segunda vez que intentamos restaurar desde una copia de seguridad de la puesta en escena.

Ambos servidores SQL son la misma versión de MS SQL 2008, que se ejecuta en hardware de 64 bits.

El código que accede a la base de datos es la misma compilación, construida con el framework .NET 2.0.

Aquí está el mensaje de error y parte de la traza de la pila:

Exception Details: 

System.Data.SqlClient.SqlException: Error converting data type numeric to numeric. 

Stack Trace: 

[SqlException (0x80131904): Error converting data type numeric to numeric.] 
    System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +1953274 
    System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4849707 
    System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194 
    System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2392 
    System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +204 
    System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +954 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162 
    System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) +175 
    System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +137 

Version Information: Microsoft .NET Framework Version:2.0.50727.4200; ASP.NET Version:2.0.50727.4016 

Si utilizo Red Puerta SQL Comparar para comparar la base de datos provisional y vivir, que son los mismos.

Aquí es el procedimiento almacenado que provoca el error en el servidor en vivo:

ALTER PROCEDURE [dbo].[File_Files_InsertUpdateSingleItem] 
(
    @FileId numeric(18,0) output, 
    @Filename nvarchar(255), 
    @Guid uniqueidentifier, 
    @Name nvarchar(100), 
    @ContentType nvarchar(50), 
    @Size numeric(18, 0), 
    @Description nvarchar(2000), 
    @DateCreated datetime, 
    @DateModified datetime, 
    @IsUserUploaded bit, 
    @UploadedByUserID numeric(18, 0) 
) 
AS 

    SET NOCOUNT ON 

    IF @FileId > 0 
     BEGIN 
      UPDATE 
       [dbo].[File_Files] 
      SET 
       [Filename] = @Filename, 
       [GUID] = @Guid, 
       [Name] = @Name, 
       [ContentType] = @ContentType, 
       [Size] = @Size, 
       [Description] = @Description, 
       [DateCreated] = @DateCreated, 
       [DateModified] = @DateModified, 
       [IsUserUploaded] = @IsUserUploaded, 
       [UploadedByUserID] = @UploadedByUserID 
      WHERE 
       [FileID] = @FileId 
     END 
    ELSE 
     BEGIN 
      INSERT INTO [dbo].[File_Files](
       [Filename], 
       [GUID], 
       [Name], 
       [ContentType], 
       [Size], 
       [Description], 
       [DateCreated], 
       [DateModified], 
       [IsUserUploaded], 
       [UploadedByUserID]) 
      VALUES(
       @Filename, 
       @Guid, 
       @Name, 
       @ContentType, 
       @Size, 
       @Description, 
       @DateCreated, 
       @DateModified, 
       @IsUserUploaded, 
       @UploadedByUserID) 

      SET @FileId = scope_identity() 
     END 
+2

instante mi favorito nombre de usuario/icono combinado, 1 – slf

+0

Por favor enviar el DDL de la mesa File_Files, extraído de su producción base de datos. Gracias. –

Respuesta

0

Significa que está de paso mayor valor al tipo de dato numérico que no se puede tener

ex

declare @d decimal(18,8) 
set @d=98723498345.456 
+0

Pero, ¿cómo fue el trabajo en la puesta en escena y no en vivo? – Robs

3

Probablemente necesite aumentar la escala yo la precisión de su columna

Echa un vistazo a este error de desbordamiento aritmético

declare @n decimal(8,2) 
select @n = 123456.12 

declare @n2 decimal(7,2) 
select @n2 = @n -- will blow up 

Msg 8115, nivel 16, estado 8, línea 5 la conversión numérica de tipo de datos numéricos.

Sobre la base de que la publicación del código proc, ahora echar un vistazo a este

CREATE PROCEDURE [dbo].[File_Files_InsertUpdateSingleItem2] 
@FileId numeric(18,0) output 
AS 

SELECT @FileId 
GO 

llamada con 18 dígitos

exec [File_Files_InsertUpdateSingleItem2] 123456789

de llamadas con 19 dígitos

exec [File_Files_InsertUpdateSingleItem2] 123456789

Msg 8114, nivel 16, estado 1, procedimiento File_Files_InsertUpdateSingleItem2, línea 0 Error de conversión g tipo de datos numérico a numérico.

Probablemente su llamada al proc causado este problema, que es la línea 0, entonces la llamada en sí proc es el problema si es mayor que 0 y luego mirar el número de línea en el proc para ver dónde exactamente falla

+0

Tablas en vivo y puesta en escena son numéricos (18,0) el procedimiento almacenado en vivo y el uso puesta en escena numérico (18,0) – Robs

+0

mensaje el código de procedimiento cinado – SQLMenace

+0

He añadido el procedimiento almacenado – Robs

2

¿Estás seguro de que tiene que ver con la restauración de la base de datos?

que he visto este error antes con numérica cuando el DB es decir numeric(5,2) y se intenta insertar un valor numérico de 1000.00

El valor máximo numeric(5,2) puede contener sería 999.99

ACTUALIZACIÓN:

Creo que sé qué es esto.

¿Cuál es el valor de Scope_Identity()? Mi conjetura es que es es más grande que 18.

ver este código de prueba a continuación:

create table #t 
(
-- Note that the identity seed is 3 numbers 
ColId int identity(100,100), 
Col varchar(10) 
) 
-- Note that this is 2 numbers 
declare @fileId numeric(2,0) 

Insert Into #t 
Values ('test') 

-- errors here 
set @fileId = scope_identity() 

select @fileId 

drop table #t 
+0

No creo que haya sido la restauración. la columna es numérica (18,0). el valor que se devuelve es 19 – Robs

+0

¿Está utilizando DataSet/DataTables en su aplicación? Si es así, ¿ha verificado que el tipo de datos en DataTable es correcto? – codingbadger

+0

no DataSet/DataTables cerca de este SP – Robs

Cuestiones relacionadas