viernes, 26 de octubre de 2012

SQLSERVER For Each sintaxis


Si necesitan realizar un For Each en SQL Server, pueden utilizar el siguiente codigo que permite recorrer una tupla de resultados:


En el siguiente ejemplo, se hace PRINT de todas las bases de datos que no sean las de sistema:



 -- Cursor para recorrer
DECLARE c CURSOR READ_ONLY FAST_FORWARD FOR

--El query que contiene la coleccion por recorrer.
    SELECT name 
    FROM sys.databases
WHERE name not in ('master','tempdb','model','msdb','aaa','bbb','ccc')

-- Variable donde ponen el valor a pivotear (item del foreach)
DECLARE @name varchar(max)

-- abre el cursor
OPEN c


-- Pone el valor en nuestro pivot
FETCH NEXT FROM c INTO @name
WHILE (@@FETCH_STATUS = 0)
BEGIN

print 'Realizando bucle en : ' + @name

-- Podria contener querys.
        -- Select * from Tabla where XXX = @name...


-- Siguiente registro
    FETCH NEXT FROM c INTO @name
    
END

-- Cierra el cursor
CLOSE c
DEALLOCATE c



Espero que les sirva.
Saludos.

jueves, 25 de octubre de 2012

SqlServer Drop Database Dinamico



Si en determinado momento quieren realizar un drop de una base de datos, y hacen algo por el estilo a esto:
drop database @name 




van a obtener un error tipo:
Incorrect syntax near '@name'.




La forma correcta se resuelve con la siguiente sintaxis:
exec ('drop database ' + @name )





Si estan necesitando la ejecucion de esta sentencia, lo mas probable es que en algun momento quieran hacer un bucle que elimine todas las tablas (exceptuando las importantes, como Master, temp, etc)...

Si necesitan aprender como se hace un bucle, puede verse desde aqui:
http://onerrorgotohell.blogspot.com.ar/2012/10/sqlserver-for-each-sintaxis.html






Solo deberian ponerle dentro del bucle la sentencia explicada...

Saludos.