0

Ceci est la suite de ma précédente question sql update for dynamic row numberObtenir de la ligne dont les valeurs ne sont pas mis à jour pendant la mise à jour de la ligne multiple

Cette fois, j'ai une condition mise à jour. J'ai 2 tables CraftTypes & EmployeeCraftTypes.

J'ai besoin de mettre à jour plusieurs lignes dans le CraftType Table et j'ai pu le mettre à jour selon la réponse fournie par TheGameiswar

Maintenant, il y a une modification de l'exigence.

Dans le tableau CraftTypes, il est une référence clé étrangère pour la colonne CraftTypeKey avec la table EmployeeCraftsTypes.

S'il existe une entrée pour CraftTypeKey dans les EmployeeCrafttypes table, puis la ligne ne doit pas être mis à jour. Egalement les CraftTypeKey dont les valeurs de ligne ne sont pas mises à jour doivent être obtenues pour renvoyer l'état FK_restriction des lignes.

C'est la requête sql que j'utilise.

  CREATE TYPE [DBO].[DEPARTMENTTABLETYPE] AS TABLE 
     (DepartmentTypeKey SMALLINT, DepartmentTypeName VARCHAR(50),DepartmentTypeCode VARCHAR(10) , DepartmentTypeDescription VARCHAR(128)) 

ALTER PROCEDURE [dbo].[usp_UpdateDepartmentType] 

@DEPARTMENTDETAILS [DBO].[DEPARTMENTTABLETYPE] READONLY 

AS 
BEGIN 
SET NOCOUNT ON; 

DECLARE @rowcount1 INT 
    BEGIN 

     BEGIN TRY 
    BEGIN TRANSACTION 

     UPDATE D1 
     SET 
      D1.[DepartmentTypeName]=D2.DepartmentTypeName 
      ,D1.[DepartmentTypeCode]=D2.DepartmentTypeCode 
      ,D1.[DepartmentTypeDescription]=D2.DepartmentTypeDescription 

     FROM 
      [dbo].[DepartmentTypes] D1 
     INNER JOIN 
      @DEPARTMENTDETAILS D2 
     ON 
      D1.DepartmentTypeKey=D2.DepartmentTypeKey 

     WHERE 
      D2.[DepartmentTypeKey] not in (select 1 from [dbo].[EmployeeDepartment] where [DepartmentTypeKey]=D2.DepartmentTypeKey) 

     SET @[email protected]@ROWCOUNT 
     COMMIT 
END TRY 
    BEGIN CATCH 
     SET @ROWCOUNT1=0 
     ROLLBACK TRAN 
    END CATCH 

    IF @rowcount1 =0 
     SELECT -174; 
    ELSE 
     SELECT 100; 

    END 
    END 

S'il vous plaît Aide Et Merci à l'avance

Répondre

0

Ok

Je pense que je me suis dit de trouver un moyen pour cette fois-ci. Je ne suis pas sûr que ce soit la bonne façon, mais c'est assez pour moi de répondre aux exigences.

J'ai sélectionné les lignes distinctes avec référence FK de EmployeeCraftsTypes comme deuxième requête de sélection.

Maintenant, je peux obtenir les valeurs de Row qui ne sont pas mises à jour en raison de la contrainte FK.

C'est la requête SQL J'ai utilisé

ALTER PROCEDURE [dbo].[usp_UpdateCraftType] 

@CRAFTDETAILS [DBO].[CRAFTTABLETYPE] READONLY 

AS 
BEGIN 

SET NOCOUNT ON; 

DECLARE @STATUSKEY TINYINT = (SELECT DBO.GETSTATUSKEY('ACTIVE')) 
DECLARE @ROWCOUNT1 INT 

    BEGIN 


BEGIN TRY 
    BEGIN TRANSACTION 

     UPDATE C1 
     SET 
       [C1].[CraftTypeName]=C2.CRAFTTYPENAME 
       ,[C1].[CRAFTTYPEDESCRIPTION]=C2.CRAFTTYPEDESCRIPTION 
       ,[C1].[StatusKey]=C2.[StatusKey] 
     FROM 
      [dbo].[CRAFTTYPES] C1 
     INNER JOIN 
      @CRAFTDETAILS C2 
     ON 
      C1.CRAFTTYPEKEY=C2.CRAFTTYPEKEY 
     WHERE 
      C2.[CRAFTTYPEKEY] NOT IN (SELECT EC.[CRAFTTYPEKEY] from [dbo].[EmployeeCrafts] EC where EC.[CRAFTTYPEKEY]=C2.[CRAFTTYPEKEY]) 

     SET @[email protected]@ROWCOUNT 
     COMMIT 
END TRY 
    BEGIN CATCH 
     SET @ROWCOUNT1=0 
     ROLLBACK TRAN 
    END CATCH 

     --SET @ROWCOUNT1 = @@ROWCOUNT 

    IF @ROWCOUNT1 =0 
     SELECT -172; 
    ELSE 
    BEGIN 
     SELECT 100; 

     SELECT DISTINCT EC.[CRAFTTYPEKEY],'Value Already Assigned' as Reason 
     FROM [DBO].[EmployeeCrafts] EC 
     JOIN @CRAFTDETAILS C3 
     on C3.[CRAFTTYPEKEY]=EC.[CRAFTTYPEKEY] 
     WHERE EC.[CRAFTTYPEKEY]=C3.[CRAFTTYPEKEY] 


    END 
    END 
END 

maintenant du côté de l'API Web je peux vérifier s'il y a un échec de mise à jour en cochant la rowcount pour la deuxième table. Si le nombre de lignes est supérieur à 0, puis mettre à jour un message d'erreur peut être généré

espère que ce sera utile à quelqu'un ....