0
votes

Erreur de syntaxe de la procédure stockée SQL Server lors de l'ajout de plusieurs ou clauses

J'essaie de sélectionner des produits à partir de la table de produits à l'aide d'une procédure stockée dans SQL Server 2016, mais lorsque j'ajoute plusieurs ou clause, cela me donne cette erreur de syntaxe:

msg 102, niveau 15, état 1, ligne 5 Syntaxe incorrecte près de '100'.

Voici la ligne de procédure stockée que lorsque je l'ajoutez, cela me donne l'erreur. (Sans cette ligne, c'est ok): xxx


6 commentaires

Votre requête se termine par ou ps.AvailabilityRank << / code>. Il manque quelque chose à la fin: ou ps.AvailabilityRank . Regardez également ps.storeid = @storeid et ps.storeid! = @Storeid


non c'était exprès, quand je l'enlève, je reçois toujours l'erreur


Vérifiez également les pièces @storeid . 'ps.storeid =' + @storeid + '...' au lieu de 'ps.storeid = @storeid'


@Sebastianbrosch maintenant il me donne cette erreur: la conversion a échoué lors de la conversion de la valeur NvarcharN 'Sélectionnez P.Productid distinct, P.BRANDID, P. [COMMANDECOUNT] à partir de produits P Rejoindre intérieur Productstores PS sur p.productid = ps.productid. .Storeid = 'au type de données int.


Quel est le type de données de @storeid? Il est préférable d'ajouter le type de données variables dans votre message.


@Genwan je l'ai ajouté


3 Réponses :


1
votes

Pour moi, il semble que @orderindex est de DataType int et pendant la concaténation de la chaîne Une conversion implicite se produit la création de l'erreur. Essayez de convertir @orderindex comme Cast (@orderindex comme varchar) Pour résoudre l'erreur `[La conversion a échoué lors de la conversion de la valeur Nvarchar ... sur Type de données Int.]

EDIT: Si ci-dessus n'est pas le cas et l'erreur ne se passe pas pendant la compilation du code, mais lors de l'exécution de la chaîne dynamique SQL @SQL @SQL , puis convertissez explicitement int DataType en varcharner pour la concaténation de chaîne sous forme de cassette (@Storeid comme varchar) .


0 commentaires

1
votes

1, si la variable est un entier, vous devez le convertir en varchar. Parce que @SQL est une chaîne.

2, veuillez clarifier le type de données de @AvailabilityStatus. J'ai utilisé '1,2' comme échantillon. p>

declare @StoreID int = 0
declare @OrderIndex int = 0
declare @availabilityStatus varchar(max) = '1,2'
declare @sql nvarchar(max)
set @sql = 
            'SELECT Distinct P.ProductId, P.BrandId, P.[' + cast(@OrderIndex as varchar(100)) + '] FROM Products P INNER JOIN ProductStores PS ON P.ProductId = PS.ProductId ' +
            'Where PS.StoreId = '+ cast(@StoreId as varchar(100))+ ' and (PS.Status  IN (' + @availabilityStatus + ') or (PS.StoreId != '+cast(@StoreId as varchar(100))+' and PS.Status IN(0,2))'

Print @sql


3 commentaires

@Geekymano Avez-vous utilisé le récent? Je viens de mettre à jour. Vous pouvez vérifier le résultat du test si la sortie est la requête souhaitée.


Maintenant, il exécute mais donne cette erreur: insérer dans #productids (ProductID, BreadId) Sélectionnez ProductID, BreadId à partir de (100) et (P.Status = 1 ou P.Status = 5)) Comme ordre temporaire par ordreCount DesSC MSG 102, Niveau 15, état 1, ligne 5 Syntaxe incorrecte près de '100'.


@Geekymano comme message d'erreur indiquait 'Erreur de syntaxe près de 100', comment sélectionnez-vous ... de (100)? Si votre nom de table est 100, veuillez utiliser des crochets [100].



1
votes

dans

'Where  PS.StoreId = **@StoreId** and (PS.Status  IN (' + @availabilityStatus + ') or (PS.StoreId != **@StoreId** and PS.Status IN(0,2))'


0 commentaires