Documentos de Académico
Documentos de Profesional
Documentos de Cultura
(2 row(s) affected)
Rows ROWCOUNT
----------- -----------
2 1
(1 row(s) affected)
you get Rows value of 2, the number of inserted rows, but ROWCOUNT is 1
because the SELECT @Rows=@@ROWCOUNT command affected 1 row
if you have multiple INSERTs or UPDATEs, etc. in your transaction, you
need to determine how you would like to "count" what is going on. You
could have a separate total for each table, a single grand total value, or
something completely different. You'll need to DECLARE a variable for
each total you want to track and add to it following each operation that
applies to it:
SELECT @AppleTotal=0,@PeachTotal=0
BEGIN TRANSACTION
INSERT INTO Apple (col1, col2) Select col1,col2 from xyz where ...
SET @AppleTotal=@AppleTotal+@@ROWCOUNT
INSERT INTO Apple (col1, col2) Select col1,col2 from abc where ...
SET @AppleTotal=@AppleTotal+@@ROWCOUNT
INSERT INTO Peach (col1, col2) Select col1,col2 from xyz where ...
SET @PeachTotal=@PeachTotal+@@ROWCOUNT
INSERT INTO Peach (col1, col2) Select col1,col2 from abc where ...
SET @PeachTotal=@PeachTotal+@@ROWCOUNT
COMMIT
Introducción
Por lo general, los administradores de bases de datos prefieren los procedimientos
almacenados en SQL en vez de funciones en SQL Server. ¿Es esta una buena práctica?
Empecemos
AS
exec HelloWorldprocedure
RETURNS varchar(20)
AS
BEGIN
END
Si se compara el código, la función requiere más código para hacer lo mismo. Los bloques
BEGIN y END son obligatorios en una función, mientras que el procedimiento almacenado
no los requiere si es solo una línea. En una función, es obligatorio utilizar los argumentos
RETURNS y RETURN, mientras que en un procedimiento almacenado no es necesario.
En pocas palabras, un procedimiento almacenado es mucho más flexible para escribir
cualquier código que uno desee, mientras que las funciones tienen una estructura y
funcionalidad rígidas.
exec HelloWorldprocedure
execute HelloWorldprocedure
execute dbo.HelloWorldprocedure
HelloWorldprocedure
The functions are less flexible. You need to specify the schema to invoke it (which is a good
practice to avoid conflicts with other object with the same name and different schema).
Como puede ver, el nombre del esquema es obligatorio para poder invocar una función:
3. Usar variables en un procedimiento
almacenado en SQL vs a una función
Ahora vamos a convertir grados Celsius a Fahrenheit utilizando procedimientos y funciones
almacenados para ver las diferencias. Empecemos con un procedimiento almacenado:
@celsius real
as
exec CONVERTCELSIUSTOFAHRENHEIT 0
RETURNS real
AS
BEGIN
RETURN @celcius*1.8+32
END
Estamos convirtiendo 0° C a °F. Como se puede ver, el código es muy simple en ambos
casos.
4. Reusabilidad
La principal ventaja de una función es que esta puede reutilizarse en código. Como por
ejemplo, puede hacer lo siguiente:
En este ejemplo, estamos concatenando la función del ejemplo 1 con una cadena. El
resultado va a ser el siguiente:
Como usted puede ver, se puede concatenar fácilmente una función con una cadena. Para
realizar algo similar con un procedimiento almacenado en SQL, vamos a necesitar una
variable de salida en un procedimiento almacenado para poder concatenar la variable de
salida con una cadena. Vamos a echar un vistazo al procedimiento almacenado:
as
El procedimiento consta en asignar la cadena “Hello World” a un parámetro de salida.
Puede utilizar la palabra de salida o salir para especificar que el parámetro es un parámetro
de salida.
El código puede ser simple, pero tiene que llamar al procedimiento para usar el parámetro
de salida que se concatena, es un poco más complejo que una función:
Como puede apreciar, se debe declarar una nueva variable llamada @message o cualquier
otro nombre de su preferencia. Cuando llama al procedimiento almacenado, se debe
especificar que es un parámetro externo. Una ventaja de los procedimientos almacenados
es que puede obtener varios parámetros mientras que, en las funciones, solo se puede
devolver una variable (función escalar) o una tabla (funciones con valores de tabla).
RETURNS varchar(22)
AS
BEGIN
execute HelloWorldprocedure
RETURN @hellovar
END
as
select dbo.helloworldfunction()
exec functioninsideprocedure
Puede invocar una función dentro de una función. El siguiente código muestra un ejemplo
simple:
RETURNS varchar(50)
AS
BEGIN
RETURN dbo.helloworldfunction()
END
as
execute dbo.HelloWorldprocedure
exec dbo.procedureinsideprocedure
Conclusiones
Los procedimientos almacenados en SQL son mucho más fáciles de crear y las funciones
tienen una estructura más rígida y admiten menos cláusulas y funcionalidades. Pero, por
otro lado, usted puede usar fácilmente los resultados de la función en T-SQL. Le mostramos
cómo concatenar una función con una cadena. La manipulación de resultados de un
procedimiento almacenado es más compleja.
Asimismo, no puede invocar procedimientos dentro de una función. Pero, por otro lado, en
un procedimiento se puede invocar funciones y procedimientos almacenados.
Finalmente, es muy importante mencionar algunos problemas de rendimiento cuando
utilizamos funciones. Sin embargo, esta desventaja se explicará en un próximo
artículo, Funciones y comparaciones de procedimientos almacenados en SQL Server.
Procedimientos Almacenados
By Trainer SQL in Programación
Procedimientos Almacenados en
SQL Server
Un procedimiento almacenado son instrucciones T-SQL almacenadas con un
nombre en la base de datos.
Mayor seguridad
Se pueden ejecutar SP con instrucciones que hacen referencia a objetos que
los usuarios no tienen permisos. El procedimiento realiza la ejecución del
código y todas las instrucciones y controla el acceso a los objetos a los que
hace referencia. Esto hace mas sencillo la asignación de permisos. Se puede
implementar la suplantación de usuarios usando Exexute As. Existe un nivel
fuerte de encapsulamiento.
Rendimiento mejorado
Los procedimientos almacenados se compila la primera vez que se ejecutan y
crean un plan de ejecución que vuelve a usarse en posteriores ejecuciones.
Para modificar un SP
Alter procedure NombreProcedimiento
[(
@PrimerParametro TipoDato,
@SegundoParametro TipoDato,… cambios
)]
As
Instrucciones del SP con cambios
go
Eliminar un SP
Drop procedure NombreProcedimiento
go
Ejercicios
Use Northwind
go