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'. P> blockQuote>
Voici la ligne de procédure stockée que lorsque je l'ajoutez, cela me donne l'erreur. (Sans cette ligne, c'est ok): p>
xxx pré> p>
3 Réponses :
Pour moi, il semble que 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 @orderindex code> est de DataType
int code> et pendant la concaténation de la chaîne Une conversion implicite se produit la création de l'erreur. Essayez de convertir
@orderindex code> comme
Cast (@orderindex comme varchar) code> Pour résoudre l'erreur `[La conversion a échoué lors de la conversion de la valeur Nvarchar ... sur Type de données Int.] p>
@SQL code> @SQL CODE>, puis convertissez explicitement int DataType en varcharner pour la concaténation de chaîne sous forme de cassette (@Storeid comme varchar) code>. P>
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
@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].
dans
'Where PS.StoreId = **@StoreId** and (PS.Status IN (' + @availabilityStatus + ') or (PS.StoreId != **@StoreId** and PS.Status IN(0,2))'
Votre requête se termine par
ou ps.AvailabilityRank << / code>. Il manque quelque chose à la fin:
ou ps.AvailabilityRank ?? code>. Regardez également
ps.storeid = @storeid code> et
ps.storeid! = @Storeid code>
non c'était exprès, quand je l'enlève, je reçois toujours l'erreur
Vérifiez également les pièces
@storeid code>.
'ps.storeid =' + @storeid + '...' code> au lieu de
'ps.storeid = @storeid' code>
@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é