2011-09-21 6 views
0

J'ai un problème pour exécuter cette instruction UPDATE. Aucune erreur n'est renvoyée, il ne met tout simplement pas à jour la table.Instruction UPDATE non mise à jour de la table

@recordExists varchar(10), 
@fileName varchar(50), 
@itemCode varchar (50), 
[email protected] datetime, 
@submittedBy varchar(30), 
@revision varchar(50), 
@itemCode5 varchar(50), 
@itemCkDigit varchar(10), 
@suffix varchar(10) 

AS 

DECLARE @sql varchar(1000) 
DECLARE @uploadDate datetime 
SET @uploadDate = GetDate() 
    -- Establish update or insert in to the graphics info table. 
IF @recordExists = 'Y' 

     SET @sql = 'UPDATE tblGraphicInfo SET [uploadDate] = ''' + CONVERT(nvarchar(20), @uploadDate) + ''', [submittedBy] = ''' + @submittedBy + ''' WHERE [itemCode] = "' + @itemCode + '"; ' 
     EXEC(@sql) 
ELSE 

Toute aide serait appréciée.

Pour info, j'ai changé la date de passage car je pensais que c'était le problème. Le champ uploadDate est défini en tant que champ datetime dans la table tblGraphicInfo.

+0

Avez-vous essayé de mettre une déclaration d'impression() pour vérifier si la valeur de @recordExists est ce que vous pensez que c'est? – Maciej

+0

Oui, la valeur de @recordExists est renseignée correctement. – htm11h

+0

L'Exec (@sql) essayera toujours d'exécuter btw comme s'il n'exécutait qu'une seule instruction, vous auriez besoin d'un wrapper BEGIN/END –

Répondre

1

Votre question est votre instruction where

WHERE [itemCode] = "' + @itemCode + '"; ' 

Vous voudrez emballer des chaînes en guillemets simples (') sans guillemets ("). Lorsque vous les échapperez dans votre chaîne, vous devrez doubler les guillemets simples. Vous pouvez également regarder sp_executsql. Il a une syntaxe beaucoup plus propre pour gérer les paramètres.

0

Avez-vous vérifié si l'une des variables que vous transmettez est nulle? Cela peut entraîner la nullité de l'ensemble de votre variable @sql également. Essayez d'imprimer votre variable @sql avec Print() pour vérifier qu'elle est ce qu'elle devrait être.

Vous pouvez également exécuter le profileur pour voir ce qui est en cours d'exécution.

0

Si l'un de vos champs est nul, @sql sera nul (la nullité concaténée est nulle).

Y at-il une raison quelconque vous utilisez EXEC plutôt que de faire ..

@recordExists varchar(10), 
@fileName varchar(50), 
@itemCode varchar (50), 
[email protected] datetime, 
@submittedBy varchar(30), 
@revision varchar(50), 
@itemCode5 varchar(50), 
@itemCkDigit varchar(10), 
@suffix varchar(10) 

AS 

DECLARE @sql varchar(1000) 
DECLARE @uploadDate datetime 
SET @uploadDate = GetDate() 
    -- Establish update or insert in to the graphics info table. 
IF @recordExists = 'Y' 

     UPDATE tblGraphicInfo SET [uploadDate] = @uploadDate, [submittedBy] = @submittedBy WHERE [itemCode] = @itemCode 
ELSE 

De plus, si vous effectuez plus d'une ligne dans un autre cas, vous aurez besoin de l'envelopper dans un BEGIN END

vous pouvez effectivement faire ce qui suit à la place, la @@ ROWCOUNT = 0 testeront si l'instruction précédente modifié aucun document et doit donc être un insert

UPDATE tblGraphicInfo SET [uploadDate] = @uploadDate, [submittedBy] = @submittedBy WHERE [itemCode] = @itemCode 

if @@ROWCOUNT=0 then 

INSERT into tblGraphicInfo (uploadDate,submittedBy,itemCode) values (@uploadDate,@submittedBy,@itemCode) 
2

Je ne vois pas pourquoi vous même besoin de chaîne dynamiquement ensemble votre déclaration UPDATE - il suffit d'utiliser:

DECLARE @sql varchar(1000) 

DECLARE @uploadDate datetime 
SET @uploadDate = GetDate() 

-- Establish update or insert in to the graphics info table. 
IF @recordExists = 'Y' 

    UPDATE dbo.tblGraphicInfo 
    SET [uploadDate] = CONVERT(NVARCHAR(20), @uploadDate), 
     [submittedBy] = @submittedBy 
    WHERE [itemCode] = @itemCode 

ELSE 
Questions connexes