la procédure stockée sql argument en paramètre de requête dynamique
Cette procédure a trois paramètres. Mais quand j'essaie d'exécuter en passant des paramètres, il m'indique une erreur. S'il vous plaît aider moi.
create procedure queryfunctions @Tabname varchar(150),@colname varchar(150),@valuesname varchar(150)
as
begin
declare @sql varchar(4000)
select @sql='select * from @Tabname where @colname=@valuesname'
exec(@sql)
end
exec queryfunctions 'education','eduChildName','Revathi'
Erreur :
Msg 1087, Niveau 15, État 2, Ligne 1
Doit déclarer la variable de table "@Tabname".
Pouvez-vous confirmer que vous êtes à la recherche pour les ligne(s) dans le
J'ai supprimé ma réponse, comme il tirait trop de downvotes pour une raison quelconque. Désolé baji, vous êtes sur votre propre avec les autres réponses que vous avez obtenu, même si elles ne sont pas si utile.
education
table où le eduChildName
colonne contient la valeur de la chaîne 'Revathi'
et pas la ligne(s) où le eduChildName
colonne contient la même valeur que le Revathi
de la colonne?J'ai supprimé ma réponse, comme il tirait trop de downvotes pour une raison quelconque. Désolé baji, vous êtes sur votre propre avec les autres réponses que vous avez obtenu, même si elles ne sont pas si utile.
OriginalL'auteur 7783 | 2012-07-26
Vous devez vous connecter pour publier un commentaire.
Ici est beaucoup plus sûr d'alternative:
Qu'ai-je changer?
dbo
préfixe lors de la création /référencement des objets.NVARCHAR
et peut être de plus de 150 caractères. Beaucoup plus sûr pour permettre les paramètres pour accueillir une table, quelqu'un pourrait ajouter à l'avenir.SET NOCOUNT ON
une protection contre la surcharge du réseau et éventuellement l'envoi erroné des ensembles de résultats au client.@sql
doit toujours êtreNVARCHAR
.QUOTENAME
autour des noms des entités telles que des tables ou des colonnes pour vous permettre de contrecarrer l'injection SQL et aussi pour se prémunir contre le mal choisi des noms (par exemple, mots-clés).s'il vous plaît laissez-moi savoir comment vous pouvez créer un objet avec un nom > 128 caractères (j'obtiens une erreur).
QUOTENAME
a été écrit expressément pour traiter avec les noms d'objet et la compréhension qu'un identificateur ne peut pas dépasser 128 caractères.Vous êtes de droite.J'ai mal compris. J'ai vu des gens utiliser Quotename dans sql dynamique non seulement sur les noms d'objet, mais sur des valeurs trop de mettre des guillemets simples autour d'elle. Comme Quotename(@v,""). Quand j'ai posté j'ai gardé cela à l'esprit, mais à tort précisé les noms des objets
-1 Vous êtes en supposant que les choses sur la question, et downvoting d'autres réponses, car ne PRÉSUMEZ pas LA MÊME CHOSE.
La préfixation des objets avec
dbo
est une bonne idée, comme c'est à l'aide deQUOTENAME
pour la délimitation des noms. Mais si vous vous appliquezQUOTENAME
à un paramètre comme ça, vous ne devriez pas passer le nom avec un préfixe, ou vous vous retrouverez avec un mauvais nom de l'objet.OriginalL'auteur Aaron Bertrand
Pourquoi êtes-vous en passant noms d'objets comme paramètres?
Si vous passez de la chaîne de valeur de @valuesname, votre code doit être
Ne sais pas comment utiliser des guillemets simples dans sql dynamique? Consultez cette http://beyondrelational.com/modules/2/blogs/70/posts/10827/understanding-single-quotes.aspx
OriginalL'auteur Madhivanan