Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pb sur transaction

4 réponses
Avatar
OokieDookie
Bonjour à tous,

Je suis en train de créer une table de dates à utiliser dans le cadre de
statistiques, et j'essaie tant bien que mal d'appréhender la notion de
transaction.

1. Quelqu'un pourrait-il me dire pourquoi le script ci-après ne passe pas, à
moins que je ne mette la ligne COMMIT en remarque ?
2. Même une fois la ligne en remarque, cela ne marche pas (pire, deux
tentatives successives se soldent une fois sur deux par un échec ('PB') ou un
"succès" (il ne fait rien)
3. Question subsidiaire, lorsque j'effectue un simple SELECT sur la table
après exécution du script, je mets plus d'une minute à récupérer les lignes
d'une année. Cela doit être du au niveau SERIALIZABLE. Sachant qu'il ne
s'agit pas d'une base de production, est-il nécessaire de conserver ce niveau
?

Je suis sous Windows XP, SQL2005 SP2.

Merci pour vos lumières,


-------------------

SET DATEFORMAT DMY
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

DECLARE @DateDeb DATETIME,
@DateFin DATETIME,
@Annee INT

SET @Annee = 2001
SET @DateDeb = CAST(('01/01/' + CAST(@Annee AS VARCHAR)) AS DATETIME)
SET @DateFin = DATEADD(DAY, -1, DATEADD(YEAR, 1, @DateDeb))

BEGIN TRANSACTION Calendrier

IF EXISTS(SELECT * FROM dbo.Calendrier WHERE YEAR(DateComplete) = @Annee)

BEGIN
PRINT 'PB'
ROLLBACK TRANSACTION Calendrier
END

ELSE

WHILE @DateDeb <= @DateFin

BEGIN

INSERT INTO
dbo.Calendrier(
DateComplete,
NumJourSemaine,
NomJourSemaine,
NumJourMois,
NumJourAn,
NumSemaine,
NumMois,
NomMois,
Trimestre,
Semestre,
An)
VALUES(
@DateDeb,
DATEPART(WEEKDAY, @DateDeb),
DATENAME(WEEKDAY, @DateDeb),
DATEPART(DAY, @DateDeb),
DATENAME(DAYOFYEAR, @DateDeb),
DATEPART(WEEK, @DateDeb),
DATEPART(MONTH, @DateDeb),
DATENAME(MONTH, @DateDeb),
DATEPART(QUARTER, @DateDeb),
CASE WHEN DATEPART(QUARTER, @DateDeb) IN (1, 2) THEN 1 ELSE 2 END,
DATEPART(YEAR, @DateDeb))

SET @DateDeb = DATEADD(DAY, 1, @DateDeb)

END

--COMMIT TRANSACTION Calendrier

SET NOCOUNT OFF

4 réponses

Avatar
Philippe TROTIN [MS]
Vous démarrez une transaction avec : BEGIN TRANSACTION Calendrier

Il faut donc la terminer soit par un rollback, soit par un commit.


Cordialement
_______________________________

Philippe TROTIN
Microsoft Services France
_______________________________
"OokieDookie" a écrit dans le message de
news:
Bonjour à tous,

Je suis en train de créer une table de dates à utiliser dans le cadre de
statistiques, et j'essaie tant bien que mal d'appréhender la notion de
transaction.

1. Quelqu'un pourrait-il me dire pourquoi le script ci-après ne passe pas,
à
moins que je ne mette la ligne COMMIT en remarque ?
2. Même une fois la ligne en remarque, cela ne marche pas (pire, deux
tentatives successives se soldent une fois sur deux par un échec ('PB') ou
un
"succès" (il ne fait rien)
3. Question subsidiaire, lorsque j'effectue un simple SELECT sur la table
après exécution du script, je mets plus d'une minute à récupérer les
lignes
d'une année. Cela doit être du au niveau SERIALIZABLE. Sachant qu'il ne
s'agit pas d'une base de production, est-il nécessaire de conserver ce
niveau
?

Je suis sous Windows XP, SQL2005 SP2.

Merci pour vos lumières,


-------------------

SET DATEFORMAT DMY
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

DECLARE @DateDeb DATETIME,
@DateFin DATETIME,
@Annee INT

SET @Annee = 2001
SET @DateDeb = CAST(('01/01/' + CAST(@Annee AS VARCHAR)) AS DATETIME)
SET @DateFin = DATEADD(DAY, -1, DATEADD(YEAR, 1, @DateDeb))

BEGIN TRANSACTION Calendrier

IF EXISTS(SELECT * FROM dbo.Calendrier WHERE YEAR(DateComplete) = @Annee)

BEGIN
PRINT 'PB'
ROLLBACK TRANSACTION Calendrier
END

ELSE

WHILE @DateDeb <= @DateFin

BEGIN

INSERT INTO
dbo.Calendrier(
DateComplete,
NumJourSemaine,
NomJourSemaine,
NumJourMois,
NumJourAn,
NumSemaine,
NumMois,
NomMois,
Trimestre,
Semestre,
An)
VALUES(
@DateDeb,
DATEPART(WEEKDAY, @DateDeb),
DATENAME(WEEKDAY, @DateDeb),
DATEPART(DAY, @DateDeb),
DATENAME(DAYOFYEAR, @DateDeb),
DATEPART(WEEK, @DateDeb),
DATEPART(MONTH, @DateDeb),
DATENAME(MONTH, @DateDeb),
DATEPART(QUARTER, @DateDeb),
CASE WHEN DATEPART(QUARTER, @DateDeb) IN (1, 2) THEN 1 ELSE 2 END,
DATEPART(YEAR, @DateDeb))

SET @DateDeb = DATEADD(DAY, 1, @DateDeb)

END

--COMMIT TRANSACTION Calendrier

SET NOCOUNT OFF




Avatar
OokieDookie
Bonjour et merci de votre réponse.

Ce que je voulais faire dans le cadre de ce script, c'est :

si une seule date existe sur l'année traitée : ROLLBACK
sinon insert et donc COMMIT.

A moins qu'il ne soit pas possible de gérer l'utilisation ROLLBACK/ COMMIT
directement dans IF ? Ou dois-je faire un COMMIT directement dans la boucle
WHILE ?

"Philippe TROTIN [MS]" a écrit :

Vous démarrez une transaction avec : BEGIN TRANSACTION Calendrier

Il faut donc la terminer soit par un rollback, soit par un commit.


Cordialement
_______________________________

Philippe TROTIN
Microsoft Services France
_______________________________
"OokieDookie" a écrit dans le message de
news:
> Bonjour à tous,
>
> Je suis en train de créer une table de dates à utiliser dans le cadre de
> statistiques, et j'essaie tant bien que mal d'appréhender la notion de
> transaction.
>
> 1. Quelqu'un pourrait-il me dire pourquoi le script ci-après ne passe pas,
> à
> moins que je ne mette la ligne COMMIT en remarque ?
> 2. Même une fois la ligne en remarque, cela ne marche pas (pire, deux
> tentatives successives se soldent une fois sur deux par un échec ('PB') ou
> un
> "succès" (il ne fait rien)
> 3. Question subsidiaire, lorsque j'effectue un simple SELECT sur la table
> après exécution du script, je mets plus d'une minute à récupérer les
> lignes
> d'une année. Cela doit être du au niveau SERIALIZABLE. Sachant qu'il ne
> s'agit pas d'une base de production, est-il nécessaire de conserver ce
> niveau
> ?
>
> Je suis sous Windows XP, SQL2005 SP2.
>
> Merci pour vos lumières,
>
>
> -------------------
>
> SET DATEFORMAT DMY
> SET NOCOUNT ON
> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
>
> DECLARE @DateDeb DATETIME,
> @DateFin DATETIME,
> @Annee INT
>
> SET @Annee = 2001
> SET @DateDeb = CAST(('01/01/' + CAST(@Annee AS VARCHAR)) AS DATETIME)
> SET @DateFin = DATEADD(DAY, -1, DATEADD(YEAR, 1, @DateDeb))
>
> BEGIN TRANSACTION Calendrier
>
> IF EXISTS(SELECT * FROM dbo.Calendrier WHERE YEAR(DateComplete) = @Annee)
>
> BEGIN
> PRINT 'PB'
> ROLLBACK TRANSACTION Calendrier
> END
>
> ELSE
>
> WHILE @DateDeb <= @DateFin
>
> BEGIN
>
> INSERT INTO
> dbo.Calendrier(
> DateComplete,
> NumJourSemaine,
> NomJourSemaine,
> NumJourMois,
> NumJourAn,
> NumSemaine,
> NumMois,
> NomMois,
> Trimestre,
> Semestre,
> An)
> VALUES(
> @DateDeb,
> DATEPART(WEEKDAY, @DateDeb),
> DATENAME(WEEKDAY, @DateDeb),
> DATEPART(DAY, @DateDeb),
> DATENAME(DAYOFYEAR, @DateDeb),
> DATEPART(WEEK, @DateDeb),
> DATEPART(MONTH, @DateDeb),
> DATENAME(MONTH, @DateDeb),
> DATEPART(QUARTER, @DateDeb),
> CASE WHEN DATEPART(QUARTER, @DateDeb) IN (1, 2) THEN 1 ELSE 2 END,
> DATEPART(YEAR, @DateDeb))
>
> SET @DateDeb = DATEADD(DAY, 1, @DateDeb)
>
> END
>
> --COMMIT TRANSACTION Calendrier
>
> SET NOCOUNT OFF
>
>



Avatar
Fred BROUARD
ce n'est pas parce que vous faites un ROLLBACK ou un COMMIT que le code
sort du programme !

Votre logique fonctionnelle devrait être comme suit :

SET DATEFORMAT DMY
SET NOCOUNT ON

DECLARE @DateDeb DATETIME,
@DateFin DATETIME,
@Annee INT

SET @Annee = 2001
SET @DateDeb = CAST(('01/01/' + CAST(@Annee AS VARCHAR)) AS DATETIME)
SET @DateFin = DATEADD(DAY, -1, DATEADD(YEAR, 1, @DateDeb))

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION Calendrier

IF EXISTS(SELECT *
FROM dbo.Calendrier
WHERE YEAR(DateComplete) = @Annee)

BEGIN
PRINT 'PB'
ROLLBACK TRANSACTION Calendrier
RETURN --> ne pas l'oublier
END


WHILE @DateDeb <= @DateFin

BEGIN

INSERT INTO
dbo.Calendrier(
DateComplete,
NumJourSemaine,
NomJourSemaine,
NumJourMois,
NumJourAn,
NumSemaine,
NumMois,
NomMois,
Trimestre,
Semestre,
An)
VALUES(
@DateDeb,
DATEPART(WEEKDAY, @DateDeb),
DATENAME(WEEKDAY, @DateDeb),
DATEPART(DAY, @DateDeb),
DATENAME(DAYOFYEAR, @DateDeb),
DATEPART(WEEK, @DateDeb),
DATEPART(MONTH, @DateDeb),
DATENAME(MONTH, @DateDeb),
DATEPART(QUARTER, @DateDeb),
CASE WHEN DATEPART(QUARTER, @DateDeb) IN (1, 2) THEN 1 ELSE 2 END,
DATEPART(YEAR, @DateDeb))

SET @DateDeb = DATEADD(DAY, 1, @DateDeb)

END

COMMIT TRANSACTION Calendrier --> sortir en validation

GO

A +

OokieDookie a écrit :
Bonjour à tous,

Je suis en train de créer une table de dates à utiliser dans le cadre de
statistiques, et j'essaie tant bien que mal d'appréhender la notion de
transaction.

1. Quelqu'un pourrait-il me dire pourquoi le script ci-après ne passe pas, à
moins que je ne mette la ligne COMMIT en remarque ?
2. Même une fois la ligne en remarque, cela ne marche pas (pire, deux
tentatives successives se soldent une fois sur deux par un échec ('PB') ou un
"succès" (il ne fait rien)
3. Question subsidiaire, lorsque j'effectue un simple SELECT sur la table
après exécution du script, je mets plus d'une minute à récupérer les lignes
d'une année. Cela doit être du au niveau SERIALIZABLE. Sachant qu'il ne
s'agit pas d'une base de production, est-il nécessaire de conserver ce niveau
?

Je suis sous Windows XP, SQL2005 SP2.

Merci pour vos lumières,


-------------------

SET DATEFORMAT DMY
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

DECLARE @DateDeb DATETIME,
@DateFin DATETIME,
@Annee INT

SET @Annee = 2001
SET @DateDeb = CAST(('01/01/' + CAST(@Annee AS VARCHAR)) AS DATETIME)
SET @DateFin = DATEADD(DAY, -1, DATEADD(YEAR, 1, @DateDeb))

BEGIN TRANSACTION Calendrier

IF EXISTS(SELECT * FROM dbo.Calendrier WHERE YEAR(DateComplete) = @Annee)

BEGIN
PRINT 'PB'
ROLLBACK TRANSACTION Calendrier
END

ELSE

WHILE @DateDeb <= @DateFin

BEGIN

INSERT INTO
dbo.Calendrier(
DateComplete,
NumJourSemaine,
NomJourSemaine,
NumJourMois,
NumJourAn,
NumSemaine,
NumMois,
NomMois,
Trimestre,
Semestre,
An)
VALUES(
@DateDeb,
DATEPART(WEEKDAY, @DateDeb),
DATENAME(WEEKDAY, @DateDeb),
DATEPART(DAY, @DateDeb),
DATENAME(DAYOFYEAR, @DateDeb),
DATEPART(WEEK, @DateDeb),
DATEPART(MONTH, @DateDeb),
DATENAME(MONTH, @DateDeb),
DATEPART(QUARTER, @DateDeb),
CASE WHEN DATEPART(QUARTER, @DateDeb) IN (1, 2) THEN 1 ELSE 2 END,
DATEPART(YEAR, @DateDeb))

SET @DateDeb = DATEADD(DAY, 1, @DateDeb)

END

--COMMIT TRANSACTION Calendrier

SET NOCOUNT OFF






--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
OokieDookie
Merci, 2 fois :

- J'avais effectivement oublié le RETURN
- Pour info je vais enfin avoir ma formation SSIS, donc je ne massacrerai
plus mes tables systèmes pour concevoir mes ETL ;) et c'est en partie grâce à
vous.

Bonne journée



"Fred BROUARD" a écrit :

ce n'est pas parce que vous faites un ROLLBACK ou un COMMIT que le code
sort du programme !

Votre logique fonctionnelle devrait être comme suit :

SET DATEFORMAT DMY
SET NOCOUNT ON

DECLARE @DateDeb DATETIME,
@DateFin DATETIME,
@Annee INT

SET @Annee = 2001
SET @DateDeb = CAST(('01/01/' + CAST(@Annee AS VARCHAR)) AS DATETIME)
SET @DateFin = DATEADD(DAY, -1, DATEADD(YEAR, 1, @DateDeb))

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION Calendrier

IF EXISTS(SELECT *
FROM dbo.Calendrier
WHERE YEAR(DateComplete) = @Annee)

BEGIN
PRINT 'PB'
ROLLBACK TRANSACTION Calendrier
RETURN --> ne pas l'oublier
END


WHILE @DateDeb <= @DateFin

BEGIN

INSERT INTO
dbo.Calendrier(
DateComplete,
NumJourSemaine,
NomJourSemaine,
NumJourMois,
NumJourAn,
NumSemaine,
NumMois,
NomMois,
Trimestre,
Semestre,
An)
VALUES(
@DateDeb,
DATEPART(WEEKDAY, @DateDeb),
DATENAME(WEEKDAY, @DateDeb),
DATEPART(DAY, @DateDeb),
DATENAME(DAYOFYEAR, @DateDeb),
DATEPART(WEEK, @DateDeb),
DATEPART(MONTH, @DateDeb),
DATENAME(MONTH, @DateDeb),
DATEPART(QUARTER, @DateDeb),
CASE WHEN DATEPART(QUARTER, @DateDeb) IN (1, 2) THEN 1 ELSE 2 END,
DATEPART(YEAR, @DateDeb))

SET @DateDeb = DATEADD(DAY, 1, @DateDeb)

END

COMMIT TRANSACTION Calendrier --> sortir en validation

GO

A +

OokieDookie a écrit :
> Bonjour à tous,
>
> Je suis en train de créer une table de dates à utiliser dans le cadre de
> statistiques, et j'essaie tant bien que mal d'appréhender la notion de
> transaction.
>
> 1. Quelqu'un pourrait-il me dire pourquoi le script ci-après ne passe pas, à
> moins que je ne mette la ligne COMMIT en remarque ?
> 2. Même une fois la ligne en remarque, cela ne marche pas (pire, deux
> tentatives successives se soldent une fois sur deux par un échec ('PB') ou un
> "succès" (il ne fait rien)
> 3. Question subsidiaire, lorsque j'effectue un simple SELECT sur la table
> après exécution du script, je mets plus d'une minute à récupérer les lignes
> d'une année. Cela doit être du au niveau SERIALIZABLE. Sachant qu'il ne
> s'agit pas d'une base de production, est-il nécessaire de conserver ce niveau
> ?
>
> Je suis sous Windows XP, SQL2005 SP2.
>
> Merci pour vos lumières,
>
>
> -------------------
>
> SET DATEFORMAT DMY
> SET NOCOUNT ON
> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
>
> DECLARE @DateDeb DATETIME,
> @DateFin DATETIME,
> @Annee INT
>
> SET @Annee = 2001
> SET @DateDeb = CAST(('01/01/' + CAST(@Annee AS VARCHAR)) AS DATETIME)
> SET @DateFin = DATEADD(DAY, -1, DATEADD(YEAR, 1, @DateDeb))
>
> BEGIN TRANSACTION Calendrier
>
> IF EXISTS(SELECT * FROM dbo.Calendrier WHERE YEAR(DateComplete) = @Annee)
>
> BEGIN
> PRINT 'PB'
> ROLLBACK TRANSACTION Calendrier
> END
>
> ELSE
>
> WHILE @DateDeb <= @DateFin
>
> BEGIN
>
> INSERT INTO
> dbo.Calendrier(
> DateComplete,
> NumJourSemaine,
> NomJourSemaine,
> NumJourMois,
> NumJourAn,
> NumSemaine,
> NumMois,
> NomMois,
> Trimestre,
> Semestre,
> An)
> VALUES(
> @DateDeb,
> DATEPART(WEEKDAY, @DateDeb),
> DATENAME(WEEKDAY, @DateDeb),
> DATEPART(DAY, @DateDeb),
> DATENAME(DAYOFYEAR, @DateDeb),
> DATEPART(WEEK, @DateDeb),
> DATEPART(MONTH, @DateDeb),
> DATENAME(MONTH, @DateDeb),
> DATEPART(QUARTER, @DateDeb),
> CASE WHEN DATEPART(QUARTER, @DateDeb) IN (1, 2) THEN 1 ELSE 2 END,
> DATEPART(YEAR, @DateDeb))
>
> SET @DateDeb = DATEADD(DAY, 1, @DateDeb)
>
> END
>
> --COMMIT TRANSACTION Calendrier
>
> SET NOCOUNT OFF
>
>


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************