Tag Archives: Script

[Procédure Stockée] Cursor / Curseur

Bonjour,

Lors du développement d’une procédure stockée, il est d’usage d’éviter l’utilisation des curseurs. Cependant ce n’est pas toujours possible. Il convient alors d’apprivoiser certaines subtilités.

Pour rappel, les curseurs permettent un parcourt ligne à ligne renvoyée par une requête de sélection (par exemple). Vous trouverez plus d’information sur leur usage sur Les procédures et les curseurs avec MS-SQL Server.

Après avoir chargé le curseur avec :

DECLARE curseur_1 CURSOR FOR (RQT)

puis avoir ouvert le curseur avec :

OPEN curseur_1

puis avoir récupéré le premier champ de la premiere ligne du curseur avec :

FETCH curseur_1 into @champ1

Un curseur se parcourt avec une boucle :

WHILE @@FETCH_STATUS = 0

BEGIN

Instructions

END

@@Fetch_Status retourne l’état de la dernière instruction FETCH effectuée sur un curseur actuellement ouvert par la connexion.

J’attire votre attention dans cet article sur l’usage de 2 curseurs imbriqués. En effet, la documentation Microsoft précise :

Supposons, par exemple, qu’un utilisateur exécute une instruction FETCH sur un curseur, puis appelle une procédure stockée qui ouvre et traite les résultats pour un autre curseur. Lorsque le contrôle revient de la procédure stockée, @@FETCH_STATUS prend en compte la dernière instruction FETCH exécutée dans la procédure stockée et non celle qui avait eu lieu avant l’appel de la procédure stockée. (http://msdn.microsoft.com/fr-fr/library/ms187308.aspx)

Il est donc impossible d’imbriquer 2 curseurs. La solution est pour y remédier est d’attaquer la table sys.dm_exec_cursors qui contient l’état des curseurs actifs distinctement.

Il faut donc remplacer le :

while fetch_status =0
par :
while (SELECT fetch_status FROM sys.dm_exec_cursors(@@spid) where name = ‘curseur_1’ ) =0

Dans le cas d’une utilisation importante de procédures stockées potentiellement imbriquées, cette solution garantie les résultats.

Si vous avez la possibilité de ne pas utiliser de curseur, c’est encore mieux 😉

Bonne soirée,

Guillaume

[SSIS] Script Task Send Mail / Tache Script Envoi de mail authentifié

Bonjour,

Voici un article technique principalement dans le but de conserver ce code pour une réutilisation ultérieure.

Lors des développements des flux d’alimentation de ma mission, j’ai eu besoin d’envoyer des mails pour :

  • Avertir de la disponibilité des fichiers

  • Suivre l’état des flux

Je laisse donc ici le script en C# que j’ai utilisé dans une script task et le script VB qui m’a permis de faire le script C#.

using System.Net.Mail ;

using System.Net;

using System;

using System.Data;

using Microsoft.SqlServer.Dts.Runtime;

using System.Windows.Forms;

namespace ST_b88226a71961424cadf01e18c7537654.csproj

{

[System.AddIn.AddIn(“ScriptMain”, Version = “1.0”, Publisher = “”, Description = “”)]

public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase

{

#region VSTA generated code

enum ScriptResults

{

Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,

Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure

};

#endregion

public void Main()

{

MailMessage myHtmlMessage;

SmtpClient mySmtpClient;

String body = “Corps du mail”;

String destinataire= “destinataire@mail.com”;

String expediteur = “expediteur@mail.com”;

String objet = ”Objet”;

String smtp = “smtp.mail.fr”;

String mdp_smtp = “mdp smtp”;

String id_smtp = expediteur;

// Pour passer des variables provenant du flux

//body = (Dts.Variables.Add(“vMSG_Body”,true,”User”,”3″)).ToString();

//adresseMail = (Dts.Variables.Add(“vMSG_Mail”, true, “User”, “3”)).ToString();

myHtmlMessage = new MailMessage(expediteur, destinataire, objet, body) ;

mySmtpClient = new SmtpClient(smtp, 25) ; //(ou 587)

mySmtpClient.EnableSsl = false ;

mySmtpClient.Credentials = new System.Net.NetworkCredential(id_smtp, mdp_smtp) ;

mySmtpClient.Send(myHtmlMessage) ;

Dts.TaskResult = (int)ScriptResults.Success;

}

}

}

En VB :

Imports System

Imports System.Data

Imports System.Math

Imports Microsoft.SqlServer.Dts.Runtime

Imports System.Net.Mail

Imports System.Net

Public Class ScriptMain

Public Sub Main()

Dim myHtmlMessage As MailMessage

Dim mySmtpClient As SmtpClient

myHtmlMessage = New MailMessage(“expediteur@mail.fr”, “destinataire@mail.fr”, “objet”, “Contenu du mail”)

mySmtpClient = New SmtpClient(“smtp.mail.fr”, 25)

mySmtpClient.EnableSsl = False

mySmtpClient.Credentials = New System.Net.NetworkCredential(“identifiant smtp”, “mdp smtp”)

mySmtpClient.Send(myHtmlMessage)

Dts.TaskResult = Dts.Results.Success

End Sub

End Class

Sources :

Englestone – SSIS Send Mail Task Change SMTP Port

SQLShare – Parameterizing the Execute SQL Task in SSIS

23/12/2011 : Suite à un afflux de spam, je bloque les commentaires sur cet article