¿Cuál es la diferencia entre un procedimiento almacenado y una vista?

138

Estoy confundido acerca de algunos puntos:

  1. ¿Cuál es la diferencia entre un procedimiento almacenado y una vista?

  2. ¿Cuándo debo usar procedimientos almacenados y cuándo debo usar vistas en SQL Server?

  3. ¿Las vistas permiten la creación de consultas dinámicas donde podemos pasar parámetros?

  4. ¿Cuál es el más rápido y sobre qué base es uno más rápido que el otro?

  5. ¿Las vistas o los procedimientos almacenados asignan memoria de forma permanente?

  6. ¿Qué significa si alguien dice que las vistas crean una tabla virtual, mientras que los procedimientos crean una tabla de materiales?

Por favor, hágame saber acerca de más puntos, si hay alguno.

NoviceToDotNet
fuente

Respuestas:

144

Una vista representa una tabla virtual . Puede unir varias tablas en una vista y usar la vista para presentar los datos como si los datos vinieran de una sola tabla.

Un procedimiento almacenado utiliza parámetros para realizar una función ... ya sea actualizar e insertar datos, o devolver valores individuales o conjuntos de datos.

Creación de vistas y procedimientos almacenados : tiene información de Microsoft sobre cuándo y por qué usar cada uno.

Digamos que tengo dos tablas:

  • tbl_user, Con columnas: user_id, user_name,user_pw
  • tbl_profile, Con columnas: profile_id, user_id,profile_description

Entonces, si me encuentro consultando desde esas tablas MUCHO ... en lugar de hacer la unión en CADA pieza de SQL, definiría una vista como:

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

Por lo tanto, si quiero consulta profile_descriptionpor user_iden el futuro, todo lo que tengo que hacer es:

SELECT profile_description FROM vw_user_profile WHERE user_id = @ID

Ese código podría usarse en un procedimiento almacenado como:

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

Entonces, más tarde, puedo llamar:

dbo.getDesc 25

y obtendré la descripción de user_id25, donde 25es tu parámetro.

Obviamente hay muchos más detalles, esta es solo la idea básica.

Patricio
fuente
1
Pero puedo unirme, puedo unir varias tablas en un procedimiento almacenado y no tengo que dar parámetros.
NoviceToDotNet
55
¿Pero por qué harías eso? ¿Qué estás tratando de lograr? Puede usar una vista COMO una tabla ... los procedimientos almacenados son para HACER cosas ... las vistas son para facilitarle la vida.
Patrick
1
Piense en una vista como una consulta almacenada, por lo que si tiene dos tablas en las que tiene que unirse mucho para realizar el trabajo, puede crear una vista en la que trabajar para no tener que unirse a ellas todo el tiempo.
Patrick
2
No lo estoy entendiendo, por favor haga un poco más de descripción.
NoviceToDotNet
2
bien, pero ALMACENA su vista entonces ... para que pueda llamarla como una sola tabla. de esa manera crea su unión una vez, y cualquier uso futuro hace referencia a la vista directamente que llama al sql subyacente como si fuera una tabla.
Patrick
107

Mucha información disponible aquí

Aquí hay un buen resumen:

Un procedimiento almacenado:

  • Acepta parámetros
  • Puede NO ser utilizado como bloque de construcción en una consulta grande
  • Puede contener varias declaraciones, bucles, IF ELSE, etc.
  • Puede realizar modificaciones en una o varias tablas
  • NO se puede utilizar como destino de una instrucción INSERT, UPDATE o DELETE.

Una vista:

  • No no aceptar parámetros
  • Se puede usar como bloque de construcción en una consulta más grande
  • Puede contener una sola consulta SELECT
  • NO puede realizar modificaciones en ninguna tabla
  • Pero puede (a veces) usarse como el objetivo de una instrucción INSERT, UPDATE o DELETE.
cusimar9
fuente
66
Además, las vistas no deben contener ninguna cláusula de "ordenar por" o "superior"
sksallaj
2
¿Qué significa "NO se puede usar como el objetivo de una instrucción INSERT, UPDATE o DELETE"? ¿No podemos usar INSERT, DELETE, UPDATE en el procedimiento almacenado?
Arsman Ahmad
"Una vista, NO acepta parámetros", ¿no es cierto? El video, por ejemplo: youtube.com/watch?v=zK-mWjUxKpw
xayer el
Las vistas pueden realizar modificaciones en la tabla / tablas base: csharp-video-tutorials.blogspot.com/2012/09/…
Khurram
8

Primero debes entender que ambas son cosas diferentes. Stored Proceduresse usan mejor para INSERT-UPDATE-DELETEdeclaraciones. Mientras que Viewsse utilizan para SELECTdeclaraciones. Deberías usar ambos.

En las vistas no puede alterar los datos. Algunas bases de datos tienen vistas actualizables donde se puede utilizar INSERT-UPDATE-DELETEen Views.

Mahesh
fuente
2
Puede alterar los datos en la tabla subyacente utilizando Vistas. Las vistas son actualizables.
Desarrollador Dot Net
7

Una vista SQL es una tabla virtual, que se basa en la consulta SQL SELECT. Una vista hace referencia a una o más tablas de bases de datos existentes u otras vistas. Es la instantánea de la base de datos, mientras que un procedimiento almacenado es un grupo de instrucciones Transact-SQL compiladas en un solo plan de ejecución.

Ver es simple mostrar datos almacenados en las tablas de la base de datos, mientras que un procedimiento almacenado es un grupo de declaraciones que se pueden ejecutar.

Una vista es más rápida ya que muestra datos de las tablas a las que se hace referencia, mientras que un procedimiento de tienda ejecuta sentencias SQL.

Consulte este artículo: Ver vs Procedimientos almacenados . Exactamente lo que buscas

reggie
fuente
5

Una vista es una forma sencilla de guardar un complejo SELECTen la base de datos.

Se utiliza un procedimiento de almacenamiento cuando el SQL simple simplemente no es suficiente. Los procedimientos de almacenamiento contienen variables, bucles y llamadas a otros procedimientos almacenados. Es un lenguaje de programación, no un lenguaje de consulta.

  1. Las vistas son estáticas. Piense en ellas como nuevas tablas con un cierto diseño y los datos que contienen se crean sobre la marcha utilizando la consulta con la que lo creó. Como con cualquier tabla SQL, puede ordenarla y filtrarla con WHERE, GROUP BYy ORDER BY.

  2. Depende de lo que hagas.

  3. El depende de la base de datos. Las vistas simples solo ejecutan la consulta y filtran el resultado. Pero las bases de datos como Oracle permiten crear una vista "materializada" que es básicamente una tabla que se actualiza automáticamente cuando cambian los datos subyacentes de la vista.

    Una vista materializada le permite crear índices en las columnas de la vista (especialmente en las columnas calculadas que no existen en ninguna parte de la base de datos).

  4. No entiendo de qué estás hablando.

Aaron Digulla
fuente
5

Además de los comentarios anteriores, me gustaría agregar algunos puntos sobre Vistas.

  1. Las vistas se pueden usar para ocultar la complejidad. Imagine un escenario en el que 5 personas están trabajando en un proyecto pero solo una de ellas es demasiado buena con cosas de bases de datos como uniones complejas. En tal escenario, puede crear Vistas que otros miembros del equipo pueden consultar fácilmente mientras consultan una sola tabla.
  2. La seguridad se puede implementar fácilmente mediante Vistas. Supongamos que somos un empleado de la tabla que contiene columnas sensibles como Salario , número de SSN . No se supone que estas columnas sean visibles para los usuarios que no están autorizados para verlas. En tal caso, podemos crear una Vista seleccionando las columnas en una tabla que no requiera ninguna autorización como Nombre , Edad , etc., sin exponer columnas sensibles (como Salario, etc., que mencionamos anteriormente). Ahora podemos eliminar el permiso para consultar directamente la tabla Empleado y simplemente mantener el permiso de lectura en la Vista. De esta manera, podemos implementar la seguridad utilizando Vistas.
Ajendra Prasad
fuente
4
  1. A VIEW es una consulta dinámica en la que puedes usar una cláusula "WHERE"
  2. Un procedimiento almacenado es una selección de datos fija, que devuelve un resultado predefinido.
  3. Ni una vista, ni un procedimiento almacenado asignan memoria. Solo una vista materializada
  4. Una TABLA es solo una ENTIDAD, una vista puede recopilar datos de diferentes ENTIDADES o TABLAS
swissben
fuente
4

Mahesh no es del todo correcto cuando sugiere que no se pueden alterar los datos en una vista. Entonces con la opinión 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

PUEDO actualizar los datos ... como ejemplo, puedo hacer cualquiera de estos ...

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

o

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

No puede INSERTAR en esta vista, ya que no todos los campos de toda la tabla están presentes y supongo que PROFILE_ID es la clave principal y no puede ser NULL. Sin embargo, a veces puede INSERTAR en una vista ...

Creé una vista en una tabla existente usando ...

Create View Junk as SELECT * from [TableName]

LUEGO

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

y

DELETE from Junk Where ID>4

Tanto el INSERT como el DELETE funcionaron en este caso

Obviamente, no puede actualizar ningún campo que se agregue o calcule, pero cualquier vista que sea solo una vista directa debería ser actualizable.

Si la vista contiene más de una tabla, no puede insertarla ni eliminarla, pero si la vista es un subconjunto de una sola tabla, generalmente puede hacerlo.

Glyn Roberts
fuente
3

La principal diferencia es que cuando consulta una vista, su definición se pega en su consulta. El procedimiento también podría dar resultados de la consulta, pero se compila y es más rápido. Otra opción son las vistas indexadas.

rsc
fuente
1

@Patrick está en lo correcto con lo que dijo, pero para responder a sus otras preguntas, una Vista se creará en la Memoria, y dependiendo del tipo de Uniones, Datos y, si se realiza alguna agregación, podría ser una Vista con mucha memoria.

Los procedimientos almacenados realizan todo su procesamiento utilizando Temp Hash Table, por ejemplo, # tmpTable1 o en la memoria utilizando @ tmpTable1. Dependiendo de lo que quieras decirle que haga.

Un procedimiento almacenado es como una función, pero se llama directamente por su nombre. en lugar de funciones que realmente se usan dentro de una consulta.

Obviamente, la mayoría de las veces las tablas de memoria son más rápidas, si no está recuperando una gran cantidad de datos.

Robbie Tapping
fuente