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
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
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
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
>
>
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" <sorrynospam@nowhere.com> a écrit dans le message de
news:6DB3F9D5-B89F-4CEE-B91F-2B0699B135A9@microsoft.com...
> 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
>
>
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
>
>
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
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
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
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 ***********************
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 ***********************
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 ***********************