martes, 30 de enero de 2018

Script para comprobar que un procedimiento almacenado existe y borrarlo

Aveces nos topamos con bases de datos enormes y es demasiado tedioso realizar la búsqueda de un Procedimiento Almacenado y eliminarlo.

Con el siguiente script se puede realizar la tare de manera rápida.

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[MyStoredProc]') AND type in (N'P', N'PC'))  DROP PROCEDURE [MyStoredProc] 

lunes, 30 de julio de 2012

Terror: División entre Cero SQL Server

Este es uno de los problemas mas comunes, ¿que hacer cuando tenemos que hacer divisiones en nuestros registros y tenemos columnas donde el divisor es igual a 0 ? pues es muy fácil SQL nos regala una función para esta situación.. NULLIF( expression , expression ) es muy sencillo usarla y nos salvara la vida en estos casos


Veamos un ejemplo:
Declararemos 2 variables la primera con un valor de 2 y otra con valor 0
declare @num1 int = 2
declare @num2 int  = 0

Si hacemos la siguiente consulta solo lograremos generar un error y estrés en nuestras mentesillas
Select @num1/@num2 as Disivion


Msg 8134, Level 16, State 1, Line 18
Divide by zero error encountered.


Ok, para solucionar esto basta con usar nuestra función NULLIF:

Select @num1/NULLIF(@num2,0) as Disivion

  y listo nos devolverá un resultado NULL



miércoles, 13 de junio de 2012

Bienvenido SQL Dinámico

Para comenzar comenzare por explicar algo que cuando me lo mencionaron por primera vez hace 8 meses en el examen de mi actual trabajo me dejo totalmente desconcertada, recuerdo muy bn el momento "Sujeto que explica el examen: De preferencia usa SQL dinámico ¿si sabes que es? - Liliana: Sinceramente no lo se - Sujeto:  Es cuando haces la consulta pero como si estuvieras programando con otro lenguaje osea con variables y así - Liliana: (En su mente) :YaoMing: Va a usar SQL dinámico su p... madre ahahaha.. " y así fue no lo use ahora ya en el trabajo me doy cuenta que es la cosa mas útil del universo hahaha bueno en cuanto a consultas SQL. Y bueno SQL dinámico como me lo explico el sujeto no es mas que poner todo el código de nuestra consulta en una variable de texto (nvarchar  siempre debe ser nvarchar en caso contrario saldrá Error) para posteriormente ejecutarlo.

Supongamos que tenemos 2 tablas dentro de nuestra base datos, una tabla que llamaremos frutas y otra que llamaremos verduras (Este es un mero ejemplo obviamente las tablas aquí expuestas sera ejemplos burdos hahaha con la estructura totalmente mal y sin normalización).

IF OBJECT_ID ('tempdb..#frutas') IS NOT NULL DROP TABLE #frutas
CREATE TABLE #frutas(id int identity(1,1), nombre varchar(100), precio numeric(23,3), cantidad  int)
IF OBJECT_ID ('tempdb..#verduras') IS NOT NULL DROP TABLE #verduras
CREATE TABLE #verduras(id int identity(1,1), nombre varchar(100), precio numeric(23,3), cantidad  int)
insert #frutas (nombre, precio,cantidad)
select 'manzana', 30, 100 union all
select 'pera', 28, 110 union all
select 'piña', 13, 30 union all
select 'sandia', 10, 10
 insert #verduras (nombre, precio,cantidad)
select 'tomate', 8, 100 union all
select 'cebolla', 12, 300 union all
select 'brocoli', 23, 55 union all
select 'chile', 10, 10 

Ahora bn para ejemplificar lo que podemos hacer con SQL dinámico es simplemente usar variables dentro de una cadena para sustituir partes de ella, para que se entienda mas fácil pongamos un ejemplo.. digamos  que queremos que con una sola consulta busque en #frutas o #verduras.. en vez de usar un if simplemente cambiamos el valor de una variable.
declare @tabla varchar(30) = 'frutas'
declare @query nvarchar(max) = 'select nombre, precio, cantidad from #'+@tabla+''
Al unir la variable de @tabla a nuestra consulta quedara como resultado Select nombre,precio,cantidad from  #frutas.. y listo basta con usar la instrucción exec sp_executesql @query  y nos dará todas las frutas dentro de la tabla y asi podemos hacer mas combinaciones por ejemplo elegir los campos.
 declare @campos varchar(30) = 'nombre,precio'declare @tabla varchar(30) = 'verduras'
declare @restri varchar(30) = 'precio >=8'declare @query nvarchar(max) = 'select '+@campos+' from #'+@tabla+' where '+@restri+''
Dando como resultado la consulta: Select nombre,precio from #verduras where precio>=8  

Y así podemos hacer mil y una combinaciones y usar las variables que queramos, armar nuestra consulta enviando solo variables y ejecutarla :)

Saludos~~