2009-12-04 3 views
0

J'ai une exigence dans laquelle j'ai besoin de voir si cette clé existe déjà. S'il existe déjà, mettez à jour les données en fonction de la clé, sinon insérez de nouvelles données.pourquoi ce comportement avec int dans SQL Server 2005

L'approche que je pris est

DECLARE @Tracking_Id INT 
SELECT @Tracking_Id = Tracking_Id 
     FROM DOCUMENT_TRACKING 
     WHERE Secondary_Document_Id = @Secondary_Document_Id 
       AND primary_Document_Id = @Primary_Document_Id 

     IF (@Tracking_Id = 0) 
      BEGIN       
       INSERT INTO DOCUMENT_TRACKING 
         (
          Primary_Document_Id, 
          Secondary_Document_Id, 
          Tracking_Result, 
          Comment, 
          Created_By, 
          Created_Dt, 
          Updated_By, 
          Updated_Dt 
         ) 
       VALUES (
          @Primary_Document_Id, 
          @Secondary_Document_Id, 
          @TrackingResult, 
          @Comments, 
          @User_ID, 
          GETDATE(), 
          @User_ID, 
          GETDATE() 
         )  
      END  

     ELSE 
      BEGIN     
       SELECT @Tracking_Id = Tracking_Id 
       FROM DOCUMENT_TRACKING 
       WHERE Secondary_Document_Id = @Secondary_Document_Id 
         AND primary_Document_Id = @Primary_Document_Id 
       UPDATE DOCUMENT_TRACKING 
       SET  tracking_result = @TrackingResult, 
         Comment = @Comments, 
         Updated_By = @User_ID, 
         Updated_Dt = GETDATE() 
       WHERE Tracking_Id = @Tracking_Id   
      END 

Maintenant, quand il n'y a pas de ligne correspondant à ma condition dans la base de données, que ce soit @Tracking_Id doit être 0 ou « » ou nul, mais il ne montre rien quand je le compare avec l'une de ces choses.

Je ne veux pas utiliser l'approche de comptage, puis comparer avec 0 ou plus grand que cela. Comment puis-je faire face à ce scenerio.

Répondre

1

vous pouvez utiliser

IF @@ROWCOUNT = 0 

voir les lignes renvoyées par une sélection.

si vous comparez avec null cette façon

IF @var = NULL 

sera toujours faux, vous devriez comparer comme:

IF @var IS NULL 
0

Essayez de changer l'instruction if à

IF (ISNULL(@Tracking_Id,0) = 0) 

Lorsque il n'y a aucun élément trouvé, @Tracking_Id est nul, et ne se compare pas à 0, donc il ira dans l'autre.

+0

non ce ne fonctionne pas avec isnull(). – Rohit

1

Je pense que vous devez remplacer

IF (@Tracking_Id = 0) 

avec

IF (@Tracking_Id IS NULL) 

Ou Utilisez

IF EXISTS(SELECT @Tracking_Id = Tracking_Id 
    FROM DOCUMENT_TRACKING 
    WHERE Secondary_Document_Id = @Secondary_Document_Id 
      AND primary_Document_Id = @Primary_Document_Id) 
BEGIN 
    UPDATE CODE HERE 
END 
ELSE 
BEGIN 
    INSERTION CODE HERE 
END 

Ou une autre alternative serait la suivante

UPDATE Statement 
IF @@ROWCOUNT = 0 
BEGIN 
    INSERTION CODE 
END 

L'idée est d'appliquer systématiquement une instruction UPDATE. Si la ligne existe la @@ rowcount sera 1.

+0

IF (@Tracking_Id IS NULL) ne fonctionne pas. C'est ma préoccupation. Son ne pas être comparé à 0, '' ou null. – Rohit

+0

IF EXISTS (SELECT @Tracking_Id = TRACKING_ID DE DOCUMENT_TRACKING OÙ Secondary_Document_Id = @Secondary_Document_Id ET primary_Document_Id = @Primary_Document_Id) donne une erreur. Je pense que vous ne pouvez pas utiliser de variable à l'intérieur de IF Existe – Rohit

+0

__IF EXISTS (SELECT Tracking_Id FROM DOCUMENT_TRACKING OERE Secondary_Document_Id = @Secondary_Document_Id AND primary_Document_Id = @Primary_Document_Id) __ –

-2

Je prédis qu'il retourne NULL plutôt que zéro - vous pouvez régler votre requête ici:

SELECT @Tracking_Id = ISNULL(Tracking_Id, 0) 
     FROM DOCUMENT_TRACKING 
     WHERE Secondary_Document_Id = @Secondary_Document_Id 
       AND primary_Document_Id = @Primary_Document_Id 
+0

Doesn ne fonctionne pas - s'il n'y a pas de lignes dans le jeu de résultats, alors l'expression dans la liste de sélection n'est jamais évaluée, donc @Tracking_Id sera toujours NULL –

0

requête comme: « SELECT @variable = champ de la table " n'efface pas (NULL) @variable lorsque @variable n'est pas nulle et qu'il n'y a aucun enregistrement dans la table. Il peut parfois conduire à des difficiles à trouver des problèmes Je recommande d'utiliser: SET @Tracking_Id = (sélectionnez TRACKING_ID DE DOCUMENT_TRACKING OÙ Secondary_Document_Id = @Secondary_Document_Id ET primary_Document_Id = @Primary_Document_Id)

ou utilisez « IF EXISTS (...) "comme Raj a écrit.

Essayez ceci:

- test de drop table

create table test (entier id)

d'insertion dans les valeurs de test (1)

insert en valeurs de test (2)

déclarer @i nombre entier jeu @ i = 123

select @i = id de test où id = 3

select @i - < - @ i = 123 - encore (WOW :))

ensemble @i = (SELECT/top 1/id de test où id = 3)

select @i - < - maintenant @ I = NULL, il est OK, vous pouvez tester la valeur NULL

set @i = (select/top 1/id à partir du test où id = 1)

sélectionnez @i - < - maintenant @ I = 1

Cordialement.

0
IF EXISTS(SELECT 1 
    FROM DOCUMENT_TRACKING 
    WHERE Secondary_Document_Id = @Secondary_Document_Id 
      AND primary_Document_Id = @Primary_Document_Id) 
BEGIN 

SELECT @Tracking_Id = Tracking_Id 
    FROM DOCUMENT_TRACKING 
    WHERE Secondary_Document_Id = @Secondary_Document_Id 
      AND primary_Document_Id = @Primary_Document_Id 

update here... 
END 
ELSE 
BEGIN 

insert here 

END 
0
if (select count(Tracking_Id) from DOCUMENT_TRACKING where [email protected]_Document_Id and [email protected]_Document_Id and Tracking_id>0)=0 
begin 

end 
else 
begin 

end 

obtient essentiellement un compte de nombre d'enregistrements des déclarations de requête et compare ensuite pour voir si elle est 0.> 0 fait en sorte que la TRACKING_ID n'est pas « » ou null