OVH Cloud OVH Cloud

IDENTITY_INSERT dans une procedure stockée

5 réponses
Avatar
osman
Bonjour,
voici le code d'une procedure stockée dans laquelle j'aimerais executer
l'instruction
SET IDENTITY_INSERT @table ON.
Bout de code de la procedure:
-- BLA BLA BLA ICI
FETCH list_of_tables into @table

-- ENCORE BLA BLA BLA

IF @a_flag = 0

BEGIN

EXEC ('ALTER TABLE ' + @table + ' NOCHECK CONSTRAINT ALL')

EXEC ('ALTER TABLE ' + @table + ' DISABLE TRIGGER all')

IF @table = 'ligne_planning'

BEGIN

SELECT @table AS 'EREKAAAAA' ---------> ca c'est juste pour
voir

EXEC ('SET IDENTITY_INSERT dbo.' + @table + ' ON') ------------------->
J'ai l'impression que cette instruction ne marche pas car le INSERT qui suit
lance une erreur.

--EXEC ('SET IDENTITY_INSERT dbo.ligne_planning ON')

EXEC ('INSERT INTO dbo.' + @table + ' ("id_ligne_planning", "id_praticien",
"date_effet", "heure") VALUES (1, ''Test'', GETDATE(), GETDATE())')

EXEC ('SELECT * FROM dbo.' + @table )

END

Si vous pouvez me dire comment resoudre.

Merci

Os.

5 réponses

Avatar
Ch.
j'ai pas trop le temps de detailler mais je pense que c'est parce que ton
identity_insert n'est pas inclus dans ton exec(...)
si quelqu'un peut confirmer ?




"osman" a écrit dans le message de news:

Bonjour,
voici le code d'une procedure stockée dans laquelle j'aimerais executer
l'instruction
SET IDENTITY_INSERT @table ON.
Bout de code de la procedure:
-- BLA BLA BLA ICI
FETCH list_of_tables into @table

-- ENCORE BLA BLA BLA

IF @a_flag = 0

BEGIN

EXEC ('ALTER TABLE ' + @table + ' NOCHECK CONSTRAINT ALL')

EXEC ('ALTER TABLE ' + @table + ' DISABLE TRIGGER all')

IF @table = 'ligne_planning'

BEGIN

SELECT @table AS 'EREKAAAAA' ---------> ca c'est juste pour
voir

EXEC ('SET IDENTITY_INSERT dbo.' + @table + ' ON') ------------------->
J'ai l'impression que cette instruction ne marche pas car le INSERT qui
suit lance une erreur.

--EXEC ('SET IDENTITY_INSERT dbo.ligne_planning ON')

EXEC ('INSERT INTO dbo.' + @table + ' ("id_ligne_planning",
"id_praticien", "date_effet", "heure") VALUES (1, ''Test'', GETDATE(),
GETDATE())')

EXEC ('SELECT * FROM dbo.' + @table )

END

Si vous pouvez me dire comment resoudre.

Merci

Os.




Avatar
osman
Il me semble bien que si. Les deux EXEC qui le precedent s'executent bien.


"Ch." a écrit dans le message de news:
%
j'ai pas trop le temps de detailler mais je pense que c'est parce que ton
identity_insert n'est pas inclus dans ton exec(...)
si quelqu'un peut confirmer ?




"osman" a écrit dans le message de news:

Bonjour,
voici le code d'une procedure stockée dans laquelle j'aimerais executer
l'instruction
SET IDENTITY_INSERT @table ON.
Bout de code de la procedure:
-- BLA BLA BLA ICI
FETCH list_of_tables into @table

-- ENCORE BLA BLA BLA

IF @a_flag = 0

BEGIN

EXEC ('ALTER TABLE ' + @table + ' NOCHECK CONSTRAINT ALL')

EXEC ('ALTER TABLE ' + @table + ' DISABLE TRIGGER all')

IF @table = 'ligne_planning'

BEGIN

SELECT @table AS 'EREKAAAAA' ---------> ca c'est juste pour
voir

EXEC ('SET IDENTITY_INSERT dbo.' + @table + ' ON') ------------------->
J'ai l'impression que cette instruction ne marche pas car le INSERT qui
suit lance une erreur.

--EXEC ('SET IDENTITY_INSERT dbo.ligne_planning ON')

EXEC ('INSERT INTO dbo.' + @table + ' ("id_ligne_planning",
"id_praticien", "date_effet", "heure") VALUES (1, ''Test'', GETDATE(),
GETDATE())')

EXEC ('SELECT * FROM dbo.' + @table )

END

Si vous pouvez me dire comment resoudre.

Merci

Os.








Avatar
BVesan
Bonjour,
Si je ne m'abuse,IDENTITY_INSERT est une variable "d'environnement".
La valeur modifiée dans un EXEC de cette variable ne sera donc valable que
tant que l'EXEC n'est pas terminé.
Dès que vous sortez de l'EXEC, il n'est donc plus possible de forcer une
valeur pour l'identity de votre table.

Il faudrait donc sortir la mise à l'assignation de cette valeur de l'EXEC
(c'est peut-être plus facile à dire qu'à faire)...
Avatar
Med Bouchenafa
Il faut faire l'ensemble dans un seul EXEC en séparant les différentes
parties par un ";"

EXEC ('SET IDENTITY_INSERT dbo.' + @table + ' ON'; INSERT INTO dbo.' +
@table + ' ("id_ligne_planning", "id_praticien", "date_effet", "heure")
VALUES (1, ''Test'', GETDATE(), GETDATE())')

--
Bien cordialement
Med Bouchenafa

"osman" a écrit dans le message de news:

Bonjour,
voici le code d'une procedure stockée dans laquelle j'aimerais executer
l'instruction
SET IDENTITY_INSERT @table ON.
Bout de code de la procedure:
-- BLA BLA BLA ICI
FETCH list_of_tables into @table

-- ENCORE BLA BLA BLA

IF @a_flag = 0

BEGIN

EXEC ('ALTER TABLE ' + @table + ' NOCHECK CONSTRAINT ALL')

EXEC ('ALTER TABLE ' + @table + ' DISABLE TRIGGER all')

IF @table = 'ligne_planning'

BEGIN

SELECT @table AS 'EREKAAAAA' ---------> ca c'est juste pour
voir

EXEC ('SET IDENTITY_INSERT dbo.' + @table + ' ON') ------------------->
J'ai l'impression que cette instruction ne marche pas car le INSERT qui
suit lance une erreur.

--EXEC ('SET IDENTITY_INSERT dbo.ligne_planning ON')

EXEC ('INSERT INTO dbo.' + @table + ' ("id_ligne_planning",
"id_praticien", "date_effet", "heure") VALUES (1, ''Test'', GETDATE(),
GETDATE())')

EXEC ('SELECT * FROM dbo.' + @table )

END

Si vous pouvez me dire comment resoudre.

Merci

Os.




Avatar
Fred BROUARD
Bonjour,

pour compléter la réponse de Med...

Effectivement il faut toujours rappeler que l'exécution dynamique du SQL se fait
EN DEHORS du contexte de la procédure. Or le flag IDENTIY INSERT est sensible au
contexte puisque valable pour la connexion (session).

A +

Med Bouchenafa a écrit:
Il faut faire l'ensemble dans un seul EXEC en séparant les différentes
parties par un ";"

EXEC ('SET IDENTITY_INSERT dbo.' + @table + ' ON'; INSERT INTO dbo.' +
@table + ' ("id_ligne_planning", "id_praticien", "date_effet", "heure")
VALUES (1, ''Test'', GETDATE(), GETDATE())')




--
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 ***********************