2011-08-23 3 views
1

J'ai une procédure stockée qui ressemble à ce qui suit, ci-dessous. Ce qui arrive, c'est que ça m'échoue quand je cours. Je l'ai réduit lorsque je tente de mettre à jour la syntaxe AGENT STATE, par exemple. QUAND PropertyDefinitionID = @passStatePropertyDefID ALORS @passState - état de l'agentClarification - Utilisation de la mise à jour TSQL

ALTER procedure [dbo].[usp_UpdateProfile] 
    @passCompanyName varchar(100), 
    @passFName varchar(50), 
    @passLName varchar(50), 
    @passEmail varchar(50), 
    @passStreet varchar(50), 
    @passCity varchar(50), 
    @passState int, 
    @passZip varchar(10), 
    @passPhone varchar(15), 
    @passUserID int 
As 
Begin 
    Declare @passCompanyNamePropertyDefID int 
    Declare @passFNamePropertyDefID int 
    Declare @passLNamePropertyDefID int 
    Declare @passEmailPropertyDefID int 
    Declare @passStreetPropertyDefID int 
    Declare @passCityPropertyDefID int 
    Declare @passStatePropertyDefID int 
    Declare @passPostalPropertyDefID int 
    Declare @passPhonePropertyDefID int 
    Declare @passACURefID int 

    Set @passCompanyNamePropertyDefID = 62 -- Local PropertyDefinitionID from server : Agent Company Name 
    Set @passFNamePropertyDefID = 61 -- Local PropertyDefinitionID from server : Agent First Name 
    Set @passLNamePropertyDefID = 63 -- Local PropertyDefinitionID from server : Agent Last Name 
    Set @passEmailPropertyDefID = 64 -- Local PropertyDefinitionID from server : Agent Email  
    Set @passStreetPropertyDefID = 65 -- Local PropertyDefinitionID from server : Agent Street 
    Set @passCityPropertyDefID = 66 -- Local PropertyDefinitionID from server : Agent City 
    Set @passStatePropertyDefID = 72 -- Local PropertyDefinitionID from server : Agent State 
    Set @passPostalPropertyDefID = 67 -- Local PropertyDefinitionID from server : Agent State 
    Set @passPhonePropertyDefID = 68 -- Local PropertyDefinitionID from server: Agent Telephone 

    If(Exists(Select UserID From AgentCompanyUser Where UserID = @passUserID)) 
    Begin 
     -- Modify First Name and Last Name in AgentCompanyUser table -- 
     Update AgentCompanyUser Set Agent_FirstName = @passFName, Agent_LastName = @passLName Where UserID = @passUserID   
    End 

    -- Modify Email Address in dnn_Users table -- 
    Update dnn_Users Set Email = @passEmail Where UserID = @passUserID 

    -- Retreive ACU_RefID from AgentCompanyUser table -- 
    Set @passACURefID = (Select ACU_RefID from AgentCompanyUser Where UserID = @passUserID) 

    -- UPDATE COMPANY WITH AGENT - AGENT PROFILE SECTION 
    Update dnn_UserProfile 
    Set PropertyValue = CASE WHEN PropertyDefinitionID = @passFNamePropertyDefID THEN @passFName -- Agent First Name 
          WHEN PropertyDefinitionID = @passLNamePropertyDefID THEN @passLName -- Agent Last Name 
          WHEN PropertyDefinitionID = @passEmailPropertyDefID THEN @passEmail -- Agent Email 
          WHEN PropertyDefinitionID = @passStreetPropertyDefID THEN @passStreet -- Agent Street 
          WHEN PropertyDefinitionID = @passCityPropertyDefID THEN @passCity -- Agent City 
          WHEN PropertyDefinitionID = @passStatePropertyDefID THEN @passState -- Agent State 
          WHEN PropertyDefinitionID = @passPostalPropertyDefID THEN @passZip -- Agent Postal 
          WHEN PropertyDefinitionID = @passPhonePropertyDefID THEN @passPhone -- Agent Phone 
         END 
    WHERE PropertyDefinitionID IN (@passFNamePropertyDefID, @passLNamePropertyDefID, @passEmailPropertyDefID, @passStreetPropertyDefID, @passCityPropertyDefID, @passStatePropertyDefID, @passPostalPropertyDefID, @passPhonePropertyDefID) 
     AND UserID IN (
     SELECT B.UserID 
     FROM CompanyAuthorizeAgent AS B 
      INNER JOIN AgentCompanyUser AS A ON A.ACU_RefID = B.FK_acu_RefID 
     WHERE A.ACU_RefID = @passACURefID) 
End 

Mais si modifier le code pour séparer le code qui me cause des problèmes. Ça marche. Le code ci-dessous modify, vous verrez que je crée une autre mise à jour:

ALTER procedure [dbo].[usp_UpdateProfile] 
    @passCompanyName varchar(100), 
    @passFName varchar(50), 
    @passLName varchar(50), 
    @passEmail varchar(50), 
    @passStreet varchar(50), 
    @passCity varchar(50), 
    @passState int, 
    @passZip varchar(10), 
    @passPhone varchar(15), 
    @passUserID int 
As 
Begin 
    Declare @passCompanyNamePropertyDefID int 
    Declare @passFNamePropertyDefID int 
    Declare @passLNamePropertyDefID int 
    Declare @passEmailPropertyDefID int 
    Declare @passStreetPropertyDefID int 
    Declare @passCityPropertyDefID int 
    Declare @passStatePropertyDefID int 
    Declare @passPostalPropertyDefID int 
    Declare @passPhonePropertyDefID int 
    Declare @passACURefID int 

    Set @passCompanyNamePropertyDefID = 62 -- Local PropertyDefinitionID from server : Agent Company Name 
    Set @passFNamePropertyDefID = 61 -- Local PropertyDefinitionID from server : Agent First Name 
    Set @passLNamePropertyDefID = 63 -- Local PropertyDefinitionID from server : Agent Last Name 
    Set @passEmailPropertyDefID = 64 -- Local PropertyDefinitionID from server : Agent Email  
    Set @passStreetPropertyDefID = 65 -- Local PropertyDefinitionID from server : Agent Street 
    Set @passCityPropertyDefID = 66 -- Local PropertyDefinitionID from server : Agent City 
    Set @passStatePropertyDefID = 72 -- Local PropertyDefinitionID from server : Agent State 
    Set @passPostalPropertyDefID = 67 -- Local PropertyDefinitionID from server : Agent State 
    Set @passPhonePropertyDefID = 68 -- Local PropertyDefinitionID from server: Agent Telephone 

    If(Exists(Select UserID From AgentCompanyUser Where UserID = @passUserID)) 
    Begin 
     -- Modify First Name and Last Name in AgentCompanyUser table -- 
     Update AgentCompanyUser Set Agent_FirstName = @passFName, Agent_LastName = @passLName Where UserID = @passUserID   
    End 

    -- Modify Email Address in dnn_Users table -- 
    Update dnn_Users Set Email = @passEmail Where UserID = @passUserID 

    -- Retreive ACU_RefID from AgentCompanyUser table -- 
    Set @passACURefID = (Select ACU_RefID from AgentCompanyUser Where UserID = @passUserID) 

    -- UPDATE COMPANY WITH AGENT - AGENT PROFILE SECTION 
    Update dnn_UserProfile 
    Set PropertyValue = CASE WHEN PropertyDefinitionID = @passFNamePropertyDefID THEN @passFName -- Agent First Name 
          WHEN PropertyDefinitionID = @passLNamePropertyDefID THEN @passLName -- Agent Last Name 
          WHEN PropertyDefinitionID = @passEmailPropertyDefID THEN @passEmail -- Agent Email 
          WHEN PropertyDefinitionID = @passStreetPropertyDefID THEN @passStreet -- Agent Street 
          WHEN PropertyDefinitionID = @passCityPropertyDefID THEN @passCity -- Agent City 
          WHEN PropertyDefinitionID = @passPostalPropertyDefID THEN @passZip -- Agent Postal 
          WHEN PropertyDefinitionID = @passPhonePropertyDefID THEN @passPhone -- Agent Phone 
         END 
    WHERE PropertyDefinitionID IN (@passFNamePropertyDefID, @passLNamePropertyDefID, @passEmailPropertyDefID, @passStreetPropertyDefID, @passCityPropertyDefID, @passPostalPropertyDefID, @passPhonePropertyDefID) 
     AND UserID IN (
     SELECT B.UserID 
     FROM CompanyAuthorizeAgent AS B 
      INNER JOIN AgentCompanyUser AS A ON A.ACU_RefID = B.FK_acu_RefID 
     WHERE A.ACU_RefID = @passACURefID) 

    -- UPDATE COMPANY WITH AGENT - AGENT PROFILE SECTION (Add 2nd Update) 
    Update dnn_UserProfile 
    Set PropertyValue = CASE WHEN PropertyDefinitionID = @passStatePropertyDefID THEN @passState-- Agent State 
         END 
    WHERE PropertyDefinitionID IN (@passStatePropertyDefID) 
     AND UserID IN (
     SELECT B.UserID 
     FROM CompanyAuthorizeAgent AS B 
      INNER JOIN AgentCompanyUser AS A ON A.ACU_RefID = B.FK_acu_RefID 
     WHERE A.ACU_RefID = @passACURefID) 

End 

Ma question est pourquoi dois-je créer une autre mise à jour au lieu d'utiliser mon code d'origine pour faire ce travail?

Merci d'avance.

+0

"il échoue sur moi" - échoue comment? –

+0

Dans la syntaxe UPDATE d'origine, tous les paramètres transmis ne sont pas mis à jour respectivement. Mais pour une raison quelconque, si je crée deux mises à jour, tous les enregistrements sont mis à jour. La différence des paramètres passés à la mise à jour est VARCHAR mais celle qui semble provoquer un conflit dans la mise à jour est une INT –

+0

Avez-vous vérifié que vous n'avez pas d'espaces de fin sur vos paramètres varchar passés? ajouter ltrim (rtrim()) à tous les contrôles de paramètres (et le champ de la table, éventuellement) dans votre déclaration de cas et voir si cela fonctionne ... –

Répondre

5

Il s'agit d'un cas classique de priorité des types de données dans SQL Server.

Int a toujours une priorité supérieure à celle de varchar.

Votre premier bloc

Dans la déclaration de mise à jour du premier bloc, quand même l'une des expressions de résultat de l'instruction CASE a un type de données int (dans ce cas @passState) et le reste du résultat les expressions de l'instruction CASE sont évaluées en type de données varchar, alors l'expression de résultat de toutes devrait être Int, car Int a une priorité supérieure à celle de varchar.

Mais comme le reste des expressions de résultat de l'affaire évalue à varchar, vous obtiendrez une erreur de syntaxe sur la première @passFName d'expression de résultat CASE qu'il attend un entier pour tous:

Erreur de syntaxe convertir la valeur varchar * * en une colonne de données type int.

Votre deuxième bloc

Dans le second bloc, la première instruction de mise à jour a le cas où tous les result_expressions évaluent à varchar. Par conséquent, il attend varchar et il n'y a pas de problèmes de conversion.

Dans la deuxième instruction de mise à jour, une seule expression de résultat est évaluée en un int (@passState). Par conséquent, il convertit implicitement int en varchar.

Solution

La solution est bien sûr de convertir @passState VARCHAR dans l'instruction CASE dans le premier bloc soit en utilisant CASE ou CONVERT comme indiqué ci-dessous.

// ...................... 
CASE WHEN (PropertyDefinitionID = @passFNamePropertyDefID) THEN @passFName -- Agent First Name 
    WHEN PropertyDefinitionID = @passLNamePropertyDefID THEN @passLName -- Agent Last Name 
    WHEN PropertyDefinitionID = @passEmailPropertyDefID THEN @passEmail -- Agent Email 
    WHEN PropertyDefinitionID = @passStreetPropertyDefID THEN @passStreet -- Agent Street 
    WHEN PropertyDefinitionID = @passCityPropertyDefID THEN @passCity -- Agent City 
    WHEN PropertyDefinitionID = @passStatePropertyDefID THEN CONVERT(varchar(50), @passState) -- Agent State 
    --WHEN PropertyDefinitionID = @passStatePropertyDefID THEN CAST(@passState as varchar(50)) -- Agent State 
    WHEN PropertyDefinitionID = @passPostalPropertyDefID THEN @passZip -- Agent Postal 
    WHEN PropertyDefinitionID = @passPhonePropertyDefID THEN @passPhone -- Agent Phone 
END 
// ........................ 

Références:

Data Type Precedence

Citation de CAST statement: * Renvoie le type le plus élevé de priorité de l'ensemble des types de result_expressions et else_result_expression en option.Pour plus d'informations, voir Priorité de type de données (Transact-SQL). *

+0

Kashinath, merci beaucoup pour votre explication détaillée et la solution. Cela a beaucoup aidé. –

Questions connexes