Quelle est la différence entre une procédure stockée et une vue?

138

Je suis confus sur quelques points:

  1. Quelle est la différence entre une procédure stockée et une vue?

  2. Quand dois-je utiliser des procédures stockées et quand dois-je utiliser des vues dans SQL Server?

  3. Les vues permettent-elles la création de requêtes dynamiques où nous pouvons passer des paramètres?

  4. Lequel est le plus rapide et sur quelle base l'un est-il plus rapide que l'autre?

  5. Les vues ou les procédures stockées allouent-elles de la mémoire en permanence?

  6. Qu'est-ce que cela signifie si quelqu'un dit que les vues créent une table virtuelle, tandis que les procédures créent une table des matériaux?

S'il vous plaît laissez-moi savoir plus de points, s'il y en a.

NoviceToDotNet
la source

Réponses:

144

Une vue représente une table virtuelle . Vous pouvez joindre plusieurs tables dans une vue et utiliser la vue pour présenter les données comme si les données provenaient d'une seule table.

Une procédure stockée utilise des paramètres pour exécuter une fonction ... qu'il s'agisse de mettre à jour et d'insérer des données, ou de renvoyer des valeurs uniques ou des ensembles de données.

Création de vues et de procédures stockées - contient des informations de Microsoft sur le moment et les raisons de les utiliser.

Disons que j'ai deux tables:

  • tbl_user, Avec des colonnes: user_id, user_name,user_pw
  • tbl_profile, Avec des colonnes: profile_id, user_id,profile_description

Donc, si je me surprends à interroger BEAUCOUP ces tables ... au lieu de faire la jointure dans CHAQUE morceau de SQL, je définirais une vue comme:

CREATE VIEW vw_user_profile
AS
  SELECT A.user_id, B.profile_description
  FROM tbl_user A LEFT JOIN tbl_profile B ON A.user_id = b.user_id
GO

Ainsi, si je veux interroger profile_descriptionpar user_iddans le futur, tout ce que j'ai à faire est:

SELECT profile_description FROM vw_user_profile WHERE user_id = @ID

Ce code pourrait être utilisé dans une procédure stockée comme:

CREATE PROCEDURE dbo.getDesc
    @ID int
AS
BEGIN
    SELECT profile_description FROM vw_user_profile WHERE user_id = @ID
END
GO

Donc, plus tard, je peux appeler:

dbo.getDesc 25

et j'obtiendrai la description de user_id25, où 25est votre paramètre.

Il y a évidemment beaucoup plus de détails, ce n'est que l'idée de base.

Patrick
la source
1
Mais je peux rejoindre peut également joindre plusieurs tables dans une procédure stockée où je n'ai pas à donner de paramètre.
NoviceToDotNet
5
mais POURQUOI feriez-vous ça? Qu'est-ce que vous essayez d'accomplir? Vous pouvez utiliser une vue COMME une table ... les procédures stockées sont pour FAIRE des choses ... les vues sont pour vous faciliter la vie.
Patrick
1
Considérez une vue comme une requête stockée, donc si vous avez deux tables que vous trouvez que vous devez beaucoup rejoindre pour travailler, vous pouvez créer une vue sur laquelle travailler afin de ne pas avoir à les joindre tout le temps.
Patrick
2
Je ne reçois pas, veuillez faire un peu plus de description.
NoviceToDotNet
2
à droite mais il stocke alors votre vue ... pour que vous puissiez l'appeler comme une seule table. de cette façon, vous créez votre jointure une fois, et tout futur utilise la référence directement à la vue qui appelle le sql sous-jacent comme s'il était une table.
Patrick
107

Beaucoup d'informations disponibles ici

Voici un bon résumé:

Une procédure stockée:

  • Accepte les paramètres
  • Ne peut PAS être utilisé comme bloc de construction dans une requête plus grande
  • Peut contenir plusieurs instructions, boucles, IF ELSE, etc.
  • Peut effectuer des modifications sur une ou plusieurs tables
  • Ne peut PAS être utilisé comme cible d'une instruction INSERT, UPDATE ou DELETE.

Une vue:

  • Ne pas accepter les paramètres
  • Peut être utilisé comme bloc de construction dans une requête plus large
  • Ne peut contenir qu'une seule requête SELECT
  • Peut pas effectuer des modifications à une table
  • Mais peut (parfois) être utilisé comme cible d'une instruction INSERT, UPDATE ou DELETE.
cusimar9
la source
6
De plus, les vues ne doivent pas contenir de clauses "order by" ou "top"
sksallaj
2
Que signifie "ne peut PAS être utilisé comme cible d'une instruction INSERT, UPDATE ou DELETE"? Ne pouvons-nous pas utiliser INSERT, DELETE, UPDATE dans la procédure stockée?
Arsman Ahmad
"Une vue, n'accepte PAS les paramètres", ce n'est pas vrai? La vidéo par exemple: youtube.com/watch?v=zK-mWjUxKpw
xayer
Les vues peuvent apporter des
Khurram
8

Vous devez d'abord comprendre que les deux sont des choses différentes. Stored Proceduressont mieux utilisés pour les INSERT-UPDATE-DELETEdéclarations. Alors que Viewssont utilisés pour les SELECTdéclarations. Vous devez utiliser les deux.

Dans les vues, vous ne pouvez pas modifier les données. Certaines bases de données Vues actualisables où vous pouvez utiliser INSERT-UPDATE-DELETEsur Views.

Mahesh
la source
2
Vous pouvez modifier les données dans la table sous-jacente à l'aide de Views. Les vues peuvent être mises à jour.
Développeur Dot Net
7

Une vue SQL est une table virtuelle basée sur une requête SQL SELECT. Une vue fait référence à une ou plusieurs tables de base de données existantes ou à d'autres vues. Il s'agit de la capture instantanée de la base de données alors qu'une procédure stockée est un groupe d'instructions Transact-SQL compilées dans un seul plan d'exécution.

La vue est une simple présentation des données stockées dans les tables de la base de données, tandis qu'une procédure stockée est un groupe d'instructions qui peuvent être exécutées.

Une vue est plus rapide car elle affiche les données des tables référencées tandis qu'une procédure de stockage exécute des instructions sql.

Consultez cet article: Afficher vs procédures stockées . Exactement ce que vous recherchez

Reggie
la source
5

Une vue est un moyen simple d'enregistrer un complexe SELECTdans la base de données.

Une procédure de stockage est utilisée lorsque le SQL simple ne suffit pas. Les procédures de stockage contiennent des variables, des boucles et des appels à d'autres procédures stockées. C'est un langage de programmation, pas un langage de requête.

  1. Les vues sont statiques. Considérez-les comme de nouvelles tables avec une certaine mise en page et les données qu'elles contiennent sont créées à la volée à l'aide de la requête avec laquelle vous les avez créées. Comme pour toute table SQL, vous pouvez la trier et la filtrer avec WHERE, GROUP BYet ORDER BY.

  2. Cela dépend de ce que vous faites.

  3. Le dépend de la base de données. Les vues simples exécutent simplement la requête et filtrent le résultat. Mais les bases de données comme Oracle permettent de créer une vue "matérialisée" qui est essentiellement une table qui est mise à jour automatiquement lorsque les données sous-jacentes de la vue changent.

    Une vue matérialisée permet de créer des index sur les colonnes de la vue (notamment sur les colonnes calculées qui n'existent nulle part dans la base de données).

  4. Je ne comprends pas de quoi vous parlez.

Aaron Digulla
la source
5

En plus des commentaires ci-dessus, je voudrais ajouter quelques points sur les vues.

  1. Les vues peuvent être utilisées pour masquer la complexité. Imaginez un scénario où 5 personnes travaillent sur un projet mais une seule d'entre elles est trop bonne avec des éléments de base de données comme des jointures complexes. Dans un tel scénario, il peut créer des vues qui peuvent être facilement interrogées par les autres membres de l'équipe lorsqu'ils interrogent n'importe quelle table.
  2. La sécurité peut être facilement mise en œuvre par Views. Supposons que nous ayons un employé de table contenant des colonnes sensibles comme Salary , numéro SSN . Ces colonnes ne sont pas censées être visibles par les utilisateurs qui ne sont pas autorisés à les consulter. Dans ce cas, nous pouvons créer une vue en sélectionnant les colonnes dans une table qui ne nécessite aucune autorisation comme le nom , l' âge, etc., sans exposer les colonnes sensibles (comme le salaire, etc. que nous avons mentionné précédemment). Nous pouvons maintenant supprimer l'autorisation d'interroger directement la table Employee et simplement conserver l'autorisation de lecture sur la vue. De cette façon, nous pouvons implémenter la sécurité à l'aide de Views.
Ajendra Prasad
la source
4
  1. Une vue est une requête dynamique dans laquelle vous pouvez utiliser une clause "WHERE"
  2. Une procédure stockée est une sélection de données fixe, qui renvoie un résultat prédéfini
  3. Ni une vue, ni une procédure stockée n'allouent de la mémoire. Seulement une vue matérialisée
  4. Une TABLE est juste une ENTITY, une vue peut collecter des données de différentes ENTITIES ou TABLES
swissben
la source
4

Mahesh n'a pas tout à fait raison lorsqu'il suggère que vous ne pouvez pas modifier les données d'une vue. Donc avec le point de vue de Patrick

CREATE View vw_user_profile AS 
Select A.user_id, B.profile_description
FROM tbl_user A left join tbl_profile B on A.user_id = b.user_id

JE PEUX mettre à jour les données ... à titre d'exemple, je peux faire l'un de ces deux ...

Update vw_user_profile Set profile_description='Manager' where user_id=4

ou

Update tbl_profile Set profile_description='Manager' where user_id=4

Vous ne pouvez pas INSÉRER dans cette vue car tous les champs de toute la table ne sont pas présents et je suppose que PROFILE_ID est la clé primaire et ne peut pas être NULL. Cependant, vous pouvez parfois INSÉRER dans une vue ...

J'ai créé une vue sur une table existante en utilisant ...

Create View Junk as SELECT * from [TableName]

PUIS

Insert into junk (Code,name) values 
('glyn','Glyn Roberts'),
('Mary','Maryann Roberts')

et

DELETE from Junk Where ID>4

L'INSERT et le DELETE ont tous deux fonctionné dans ce cas

Évidemment, vous ne pouvez pas mettre à jour les champs qui sont agrégés ou calculés, mais toute vue qui n'est qu'une vue simple devrait pouvoir être mise à jour.

Si la vue contient plus d'une table, vous ne pouvez pas insérer ou supprimer, mais si la vue est un sous-ensemble d'une seule table, vous le pouvez généralement.

Glyn Roberts
la source
3

La principale différence est que lorsque vous interrogez une vue, sa définition est collée dans votre requête. La procédure pourrait également donner des résultats de requête, mais elle est compilée et pour ainsi plus rapidement. Les vues indexées sont une autre option.

rsc
la source
1

@Patrick a raison avec ce qu'il a dit, mais pour répondre à vos autres questions, une vue se créera en mémoire, et selon le type de jointures, de données et s'il y a une agrégation effectuée, cela pourrait être une vue assez gourmande en mémoire.

Les procédures stockées effectuent tout leur traitement soit en utilisant Temp Hash Table, par exemple # tmpTable1, soit en mémoire en utilisant @ tmpTable1. Selon ce que vous voulez lui dire de faire.

Une procédure stockée est comme une fonction, mais est appelée directement par son nom. au lieu de Fonctions qui sont réellement utilisées dans une requête elle-même.

Évidemment, la plupart du temps, les tables de mémoire sont plus rapides, si vous ne récupérez pas beaucoup de données.

Robbie Tapping
la source