2010-06-07 8 views
6

Nous avons un problème très étrange avec une base de données qui a été déplacée de la mise en scène à la production.Sql Exception: Erreur de conversion du type de données numérique en numérique

La première fois que la base de données a été déplacée, c'était en la détachant, en la copiant et en la rattachant, la deuxième fois que nous avons essayé de la restaurer à partir d'une sauvegarde de la mise en scène.

Les deux serveurs SQL sont la même version de MS SQL 2008, fonctionnant sur du matériel 64 bits.

Le code accédant à la base de données est la même version, construite à l'aide du framework .net 2.0.

Voici le message d'erreur et une partie de la trace de la pile:

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 j'utilise Red Gate SQL Comparer pour comparer la base de données de mise en scène et en direct, ils sont les mêmes.

Voici la procédure stockée qui provoque l'erreur sur le serveur en direct:

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

instantanément mon nom d'utilisateur préféré/icône combo, +1 – slf

+0

S'il vous plaît poster le DDL de la table File_Files, extrait de votre production base de données. Merci. –

Répondre

0

Cela signifie que vous passez plus grande valeur pour le type de données numérique qu'il ne peut pas avoir

ex

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

Mais comment cela a-t-il fonctionné en mise en scène et non en live? – Robs

3

Vous avez probablement besoin d'augmenter l'échelle et/ou la précision de votre colonne

Jetez un oeil à ce

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

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

Msg 8115, niveau 16, état 8, ligne 5 erreur de dépassement arithmétique conversion numérique à numérique de type de données.

Basé sur vous affichant le code de proc, prenez maintenant un coup d'oeil à ce

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

SELECT @FileId 
GO 

appel avec 18 chiffres

exec [File_Files_InsertUpdateSingleItem2] 123456789

appel avec 19 chiffres

exec [File_Files_InsertUpdateSingleItem2] 123456789

Msg 8114, niveau 16, état 1, procédure File_Files_InsertUpdateSingleItem2, ligne 0 Erreur de conversion g type de données numérique à numérique.

probablement votre appel au proc a causé ce problème, il est la ligne 0, l'appel proc lui-même est le problème si elle est supérieure à 0 puis regardez le numéro de ligne dans le proc pour voir où il échoue exactement

+0

tableaux en direct et la mise en scène sont numériques (18,0) La procédure stockée en numérique d'utilisation en direct et la mise en scène (18,0) – Robs

+0

Postez le code de procédure sored – SQLMenace

+0

J'ai ajouté la procédure stockée – Robs

2

Etes-vous sûr que cela a à voir avec la restauration de la base de données?

Je l'ai vu cette erreur avant avec numérique lorsque le DB est dire numeric(5,2) et vous essayez d'insérer une valeur numérique de 1000.00

La valeur maximale numeric(5,2) peut contenir serait 999.99

MISE À JOUR:

Je pense que je sais ce que c'est.

Quelle est la valeur de Scope_Identity()? Je pense que est est plus grand que 18.

ce code d'essai ci-dessous:

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

Je ne pense pas que c'était la restauration. la colonne est numérique (18,0). la valeur renvoyée est 19 – Robs

+0

Utilisez-vous DataSet/DataTables dans votre application? Si oui, avez-vous vérifié que le type de données sur le DataTable est correct? – codingbadger

+0

pas DataSet/DataTables près de ce SP – Robs