27 juillet 2017

Les Cursors SQL

Cela sert à parcourir de manière itérative des données.
Voici la séquence de bouts de code à utiliser :

Etape 1) Les variables des données à manipuler (ici un int et un Varchar(50)
DECLARE @a INT, @b VARCHAR(50);

Etape 2) déclaration du curseur
DECLARE variable_cursor CURSOR FOR 
SELECT  x, y FROM ...
;

  • Adapter le SELECT en fonction des besoins, les colonnes remontées correspondent aux variables de l'étape 1)
  • Le nom de la variable du curseur ne comporte pas de @ !


Etape 3) ouverture du curseur et remplissage des variables
OPEN variable_cursor;
FETCH NEXT FROM variable_cursor INTO @a, @b;

On voit bien ici qu'il faut une adéquation des variables aux colonnes du SELECT !

Etape 4) Boucle tant que c'est pas fini
WHILE (@@FETCH_STATUS <> -1)
BEGIN
  --- Faire ici le traitement utilisant nos variables remplies @a et @b

Etape 5) Fin de boucle
  FETCH NEXT FROM variable_cursor INTO @a, @b;
END

Etape 6) Nettoyage : Très très important : ne pas oublier

CLOSE variable_cursor;
DEALLOCATE variable_cursor;


Enjoy

13 juillet 2017

Shrink des logs d'un BDD SQL Server

Voici un script pour réduite la taille du journal des transactions

DECLARE @size INT;
SET @size = 10;   --- Taille du log à la fin en MegaBytes

DECLARE @database VARCHAR(200);
SET @database = DB_NAME();  --- Obtient le nom de la base en cours

--- le shrink des logs
DECLARE @sqlShrink VARCHAR(MAX);
SET @sqlShrink = '
DECLARE @logfilename NVARCHAR(200);

USE [' + @database + '];
ALTER DATABASE ['+ @database +'] SET RECOVERY SIMPLE;

DECLARE crsor CURSOR FOR
SELECT [name] FROM [sys].[database_files] 
WHERE [type] = 1;
OPEN crsor 
  FETCH crsor  INTO @logfilename
  WHILE @@FETCH_STATUS = 0
  BEGIN
    DBCC SHRINKFILE (@logfilename, '+CONVERT(VARCHAR(20), @size)+');
    FETCH crsor INTO @logfilename
  END
CLOSE crsor
DEALLOCATE crsor

ALTER DATABASE [' + @database + '] SET RECOVERY FULL;


USE master;
';
EXEC (@sqlShrink);


Dans le principe :
1) On passe la base en cours dans le mode Recovery Simple
2) Pour chaque fichier de log (LDF) on fait un DBCC SHRINKFILE
3) On remet la base dans le mode Recovery Full

Il doit surement pouvoir être amélioré mais bon ça fait le job !

Merci aux auteurs initaux du script ;-)