Documentos de Académico
Documentos de Profesional
Documentos de Cultura
-- Procedimiento almacenado que muestra o devuelve información de columna para los objetos especificados que se pueden consultar en el
entorno actual:
exec sp_columns <nametable>
-- Eliminar tabla:
Drop table <nametable>
-- seleccionar todos los datos de la tabla venta (alias v) y los campos description de tabla concepto (alias c), donde el campo
id_Venta de c es igual al campo id de v.
-- modificar una vista una vista que tiene que ver con consultas select, se agrega a la vista la instrucción alter
END
GO
-- otro ejemplo
USE [miDB]
GO
/****** Object: UserDefinedFunction [dbo].[fnMes] Script Date: 27/08/2021 10:15:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
La primera y más obvia diferencia, es que las funciones siempre retornan un valor, mientras que un procedimiento almacenado puede que retorne un
valor o puede que no lo haga. Es decir que puede comportarse como un método o como una función, haciendo una analogía con el desarrollo de
software.
Otra diferencia muy importante para los desarrolladores es que los procedimientos almacenados pueden ser invocados desde el entorno de
desarrollo, es decir desde .NET, pero las funciones no. Así que al momento de desarrollar, siempre nos comunicaremos con procedimientos
almacenados.
Las funciones de hecho no pueden ser invocadas por sí solas, mientras que los procedimientos almacenados sí. Para invocar una función, esta debe
estar dentro de una instrucción. Por ejemplo:
DECLARE
@modelo as int
Select @modelo= dbo.FN_GetModeloNow()
Sin embargo aunque pareciera que las funciones tienen ciertas desventajas sobre los procedimientos almacenados, en realidad no es así,
simplemente sirven para diferentes cosas.
Uno de las grandes ventajas es que las funciones retornan valores procesables. Es cierto los stored procedures también retornan valores....pero
cuando eso sucede solamente podemos procesar los valores de tipo escalar. Por ejemplo:
EXEC dbo.Calculador 1,@monto=@suma OUTPUT
Aquí estoy asignado a la variable @suma el valor de salida @monto de mi stored procedure. Pero si mi stored procedure retorna una tabla o conjunto
de tablas, no es posible recuperar esos valores y usarlos para procesarlos dentro de otro código. En cambio todo valor que retorna de una función
puede ser procesado. Por ejemplo una función puede retornar un tabla completa y puedo operar con ella. En este ejemplo solo la desplegare con un
Select:
select * from dbo.FN_Vista( )
CREATE FUNCTION dbo.FN_Vista
(
)
RETURNS @TempVista TABLE
(
idUsuario INT NULL,
idModulo INT NULL,
idVista INT NULL,
idDepartamento INT NULL
)
AS
En el cuerpo de la función definir que datos deseo poner en mi tabla @TempVista. Una vez que se recupera esta tabla de la función puedo usarla
para insertar en otra tabla, usar sus valores para hacer comparaciones, hacer JOIN con otras tablas, etc. Por ejemplo:
SELECT * FROM Usuarios U
INNER JOIN Departamento dep ON U.idDepartamento = dep.idDepartamento
INNER JOIN FN_Vista( ) UR on UR.idUsuario = U.idUsuario
Por definición,las funciones son ideales para retornar valores con los que deseo operar, mientras que los procedimientos almacenados suelen ser la
parte de salida final del código. Es decir que el procedimiento almacenado es el que se comunica directamente con el usuario y le presenta el
resultado final.
Por eso, una función no puede invocar un procedimiento almacenado , solamente puede invocar otra función. En cambio el procedimiento
almacenado, como es código final, puede invocar funciones y procedimientos almacenados.
utilizar procedimientos almacenados
Así que a correcta integración de un sistema que use ambos, sería
-- Ahora se requiere crear un procedimiento almacenado para reemplazar a Sandra ya que será eliminada del sistema porque ya no trabaja
con nosotros. Para eso primero se debe primero asignar los clientes de Sandra a otro vendedor, y luego eliminar a Sandra del sistema.
-- creamos el procedimiento almacenado:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- (4)Eliminamos vendedor
Delete vendedor where id=@idVendedor_a_eliminar
end
else
begin
select 'No existe otro vendedor para transferir'
end
end
--select @CantidadVendedoresPosibles
END
GO
-- FINALMENTE EJECUTAMOS EL PROCEDIMIENTO ALMACENADO Y un parámetro que corresponde al vendedor a eliminar y reemplazar por otro de la
lista
actualizada tabla
Sql Server para novatos | Union, Union All, Crear funciones SQL
--
if @opcion = 1
begin
insert into @Tabla (nombre, correo) select nombre, correo from vendedor
end
else if @opcion = 2
begin
insert into @Tabla (nombre, correo) select nombre, correo from cliente
end
else if @opcion = 3
begin
insert into @Tabla (nombre, correo)
select nombre, correo from vendedor
union
select nombre, correo from cliente
end
RETURN
end
GO
-- PARA llamar a esa función:
select * from fnCorreos(3)
Having | #6
-- Una función de agregación es una función que resume las filas de un grupo en un solo valor. COUNT , MIN y MAX son ejemplos de funciones de agregación.
Cuando se usa junto con una cláusula GROUP BY , los grupos resumidos suelen tener al menos una fila.
La cláusula GROUP BY te permite organizar las filas de una consulta en grupos. Los grupos están determinados por las columnas que
se especifican en la cláusula GROUP BY . En esta consulta, la cláusula GROUP BY regresa un grupo para cada combinación de los
valores en las columnas enumeradas en la cláusula GROUP BY
-- hace filtrado con instruccion HAVING: Especifica una condición de búsqueda para un grupo o una función de agregacion. HAVING solo se
puede usar con la instrucción SELECT. HAVING se utiliza normalmente con una cláusula GROUP BY. Cuando no se usa GROUP BY, hay un grupo
agregado único implícito. WHERE es para registros individuales y HAVING para filtrados sobre un grupo de registros cuando se utiliza función
agregada.
Subconsultas, consultas anidadas | #7
select *, (
--sub consulta, donde devuelve una columna totalcoindice con los valores
-- donde coinciden el id de cliente con el campo id_Client de venta
select count(id) from venta as v
where cli.id = v.id_Client
and (
select count(*) from concepto as c
where c.id_Venta = v.id
) > 0
) as totalcoincide
from cliente as cli
/*select '' as venta, id_Client,'' as cliente, cli.id, cli.nombre from venta as v, cliente as cli
where cli.id = v.id_Client