0
votes

Erreur lors de l'exécution d'une procédure stockée ayant l'endroit généré de manière dynamique

J'ai une instruction sélectionnée qui a condition générée en fonction du paramètre entrant. ` xxx

J'ai exécuté la déclaration et les erreurs suivantes sont disponibles

Syntaxe incorrecte près de "prospérer" ..

Quelqu'un peut-il verser une lumière ce que je suis manquant dans le suivant

après la suggestion et les modifications effectuées, vous trouverez ci-après la délégation de sélection disponible à Execute

Sélectionnez LoansecurityId de Loansecurity Où Accountreferencenumber = @accountreferencenumber et StreetAddress1 = 15 Prosper Court and Suburb = Wodonga et Postcode = 1245

la chaîne INS La whéréclause ne vient pas correctement


0 commentaires

4 Réponses :


0
votes

Votre ne peut pas simplement ajouter une chaîne à votre requête où code> clause. Vous devez utiliser Dynamic SQL

SET  @sql = 'SELECT LoanSecurityId FROM LoanSecurity WHERE AccountReferenceNumber = @AccountReferenceNumber' 
          + @WhereClause

EXEC sp_executesql @sql, N'@AccountReferenceNumber int', @AccountReferenceNumber


0 commentaires

0
votes

Lorsque vous avez la valeur INT, vous devez utiliser moulage (@param comme nvarchar (n)) Par exemple: xxx


1 commentaires

Pour votre nouveau problème, utilisez '' (deux citations simples) avant et après la valeur de la chaîne



0
votes

Après avoir réglé la chaîne d'entrée et le changement de code suivant, il fonctionne

DECLARE @ApplicationNumber  int = 0;
DECLARE @AccountReferenceNumber  int;
set @AccountReferenceNumber= 820829;
DECLARE @SecurityNumber int = 1;
DECLARE @StreetAddress1  varchar(250)= '''15 prprpCourt''';
DECLARE @StreetAddress2 varchar(250) = NULL;
DECLARE @Suburb varchar(250)= '''tester''';
DECLARE @State varchar(250) = NULL;
DECLARE @Postcode varchar(250) = '''5589''';
DECLARE @IsDeleted  bit = 0;
DECLARE @IsClass bit  = 1;
declare    @BaseQuery nvarchar(max) = N'SELECT LoanSecurityId
            FROM LoanSecurity WHERE AccountReferenceNumber = ';
IF @IsClass = 1 
 DECLARE @tableid INT = 0;


  DECLARE @WhereClause VARCHAR(max) = '';
  
        SET @WhereClause =  @AccountReferenceNumber ; 

          IF @StreetAddress1 IS NOT NULL 
            BEGIN 
                SET @WhereClause = @WhereClause + ' AND  StreetAddress1 = ' + @StreetAddress1; 

            END 

          IF @StreetAddress2 IS NOT NULL 
            BEGIN 
                SET @WhereClause = @WhereClause 
                                   + ' AND StreetAddress2 = ' + @StreetAddress2; 
            END 

          IF @Suburb IS NOT NULL 
            BEGIN 
                SET @WhereClause = @WhereClause + ' AND Suburb= ' + @Suburb; 
            END 

          IF @Postcode IS NOT NULL 
            BEGIN 
                SET @WhereClause = @WhereClause + ' AND Postcode= ' + @Postcode; 
            END 


          SET @BaseQuery = @BaseQuery + @WhereClause;

         -- SELECT @BaseQuery
          execute sp_executesql @BaseQuery;


1 commentaires

Cela aurait été meilleur si vous aviez ajouté les citations supplémentaires dans les définitions de la clause WHERE plutôt qu'au niveau de la variable, comme vous ne pouvez pas vous attendre à une personne saisissant les valeurs variables pour vous ajouter de citations supplémentaires pour vous. En tant que développeur, ce serait votre travail;) Vous envisagez également de prélever la réponse que la réponse vous a donné l'indice plutôt que de fournir et d'accepter votre propre réponse.



0
votes

Vous utilisez mal SQL si vous construisez de manière dynamique vos déclarations SQL. Il n'y a que des cas de bord rares où cela est nécessaire, généralement lorsque le nom de la table ou de la vue est inconnu au moment de l'exécution.

Vous pouvez effectuer votre requête sans construire l'instruction SQL de manière dynamique à l'aide de isnull à votre avantage. xxx

ps ... Votre performance d'exécution sera généralement beaucoup mieux si vous utilisez SQL natif au lieu de créer une instruction SQL à la volée.


0 commentaires