Variable nom de la table dans l'instruction select
J'ai quelques tables pour stocker les différentes informations du fichier, comme les pouces, les images, les fiches techniques, ...
Je suis en train d'écrire une procédure stockée pour récupérer le nom d'un ID spécifique. quelque chose comme:
CREATE PROCEDURE get_file_name(
@id int,
@table nvarchar(50)
)as
if @table='images'
select [filename] from images
where id = @id
if @table='icons'
select [filename] from icons
where id = @id
....
Comment puis-je réécrire cette procédure à l'aide de case when
déclaration ou dois-je simplement utiliser le tableau comme nom de variable?
Pour une meilleure conception de la solution que j'avais recommandé de déplacer "fichier" entité à une autre table et de référence de référence dans le domaine avec une CLÉ ÉTRANGÈRE. Ensuite, vous n'aurez pas besoin de vous embêter avec SQL évaluation
tu veux dire que j'ai une table de fichiers et liés à toutes les images, les icônes,... tables à elle?
oui. Puis Joint vous aidera à obtenir tout les trucs avec les données du fichier:
tu veux dire que j'ai une table de fichiers et liés à toutes les images, les icônes,... tables à elle?
oui. Puis Joint vous aidera à obtenir tout les trucs avec les données du fichier:
SELECT icons.Name, file.Filename FROM icons INNER JOIN files ON files.Id=icons.FileId WHERE icons.Id=1
OriginalL'auteur Ashkan Mobayen Khiabani | 2013-11-06
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas utiliser les cas .. quand passer entre une table dans la clause from (comme vous pouvez dans un conditionnel
ORDER BY
). c'est à dire si les éléments suivants:ne fonctionne pas.
De sorte que vous aurez besoin d'utiliser le SQL dynamique. Il est préférable de paramétrer la requête, autant que possible, par exemple, le
@id
valeur peut être paramétré:Comme avec tous les Sql dynamique, notez que
unparameterized
valeurs qui sont remplacées dans la requête (comme@table
), faire la requête vulnérables aux attaques par Injection Sql. En conséquence, je vous conseille de vous assurer que@table
provient d'une source fiable, ou mieux encore, la valeur de@table
est comparée à une liste blanche de permis tables avant l'exécution de la requête.la raison pour laquelle je vous pose cette question est que Si j'ajoute d'autres tables comme celles-là, je ne veux pas de procédure stockée besoin de changements, que dans ce cas ou la mienne aura besoin
Bon point, je suppose que vous ne voulez pas de répéter votre requête (SEC). J'ai mis à jour avec une segmentation en unités / substitution de motif. Je voulais faire le point que vous feriez mieux de le paramétrage de
@id
- il a une injection sql de sécurité et plan de requête cache plus d'avantages que le simple chaîne d'enchaînement. Aussi, n'oubliez pas de valider @table, comme cela ne peut pas être paramétrée à l'OFC.OriginalL'auteur StuartLC
Juste construire une chaîne SQL dans une variable et de l'EXÉCUTER
OriginalL'auteur oxfn
OriginalL'auteur Raj