Requêtes construites dynamiquement ???

Le
WonderMan
Bonjour,

Je développe une série de procédures stockées qui s'appellent les unes
les autres sous MS SQL Server 2005.

A un moment donné, j'arrive à ce code :

DECLARE @sSql AS NVARCHAR(1000)
DECLARE @SystemName as VARCHAR(200)
DECLARE @CatalogName as VARCHAR(200)

(@fieldID est un INT qui contient une valeur passée en paramètre qui
est conforme à ce qu'on attend)

SET @SystemName = 'SERVER_NAME" -- Nom du serveur
SET @CatalogName = 'DATABASE_NAME' -- Nom de la base

SET @sSql = N'INSERT INTO ['
SET @sSql = @sSql + @SystemName + '].'
SET @sSql = @sSql + @CatalogName
SET @sSql = @sSql + '.dbo.MyOtherTable ('
SET @sSql = @sSql + 'Field1,Field2,Field3,Field4)'
SET @sSql = @sSql + ' (SELECT Field1,Field2,Field3'
SET @sSql = @sSql + ',Field4,FROM MyTable WHERE Field_ID = '
SET @sSql = @sSql + CAST(@fieldID AS VARCHAR(10))
SET @sSql = @sSql + ')'
EXEC sp_executesql @sSql
--EXEC(@sSql)

et s'il s'exécute sans erreurs, je constate après coup que les données
devant être insérées dans la table MyOtherTable de la base distante ne
s'y trouvent pas.

Par contre, si je remplace le :
EXEC sp_executesql @sSql
de la fin par un
SELECT @sSql
les commandes INSERT fabriquées dynamiquement sont alors affichées. Et
si alors je les copie une par une et que je les exécute, tout
fonctionne, je n'ai pas de messages d'erreur, et les données sont bien
insérées dans la table MyOtherTable.

Y a t-il une raison pour lauqelle la commande EXEC sp_executesql @sSql
ne marcherait pas, alors qu'en faisant les insertions "à la main" cela
fonctionne, preuve que la construction dynamique de mes requêtes est
syntaxiquement correcte ?

FYI, j'ai aussi essayé de remplacer EXEC sp_executesql @sSql par
EXEC(@sSql) mais sans que cela ne change rien au résultat

Merci de votre aide.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Patrice
Le #11879521
Cela semble pourtant ne pas être syntaxiquement correct ( virgule après
Field4 ?) plus je commencerais par vérifier que le select sélectionne bien
une ligne (et pourquoi mettre le select entre parenthèse).

Egalement la stratégie habituelle est d'imprimer @sSql et de l'exécuter à la
main pour voir de quoi il retourne en exécutant exactement cette chaîne.

--
Patrice

"WonderMan" :
Bonjour,

Je développe une série de procédures stockées qui s'appellent les unes les
autres sous MS SQL Server 2005.

A un moment donné, j'arrive à ce code :

DECLARE @sSql AS NVARCHAR(1000)
DECLARE @SystemName as VARCHAR(200)
DECLARE @CatalogName as VARCHAR(200)

(@fieldID est un INT qui contient une valeur passée en paramètre qui est
conforme à ce qu'on attend)

SET @SystemName = 'SERVER_NAME" -- Nom du serveur
SET @CatalogName = 'DATABASE_NAME' -- Nom de la base

SET @sSql = N'INSERT INTO ['
SET @sSql = @sSql + @SystemName + '].'
SET @sSql = @sSql + @CatalogName
SET @sSql = @sSql + '.dbo.MyOtherTable ('
SET @sSql = @sSql + 'Field1,Field2,Field3,Field4)'
SET @sSql = @sSql + ' (SELECT Field1,Field2,Field3'
SET @sSql = @sSql + ',Field4,FROM MyTable WHERE Field_ID = '
SET @sSql = @sSql + CAST(@fieldID AS VARCHAR(10))
SET @sSql = @sSql + ')'
EXEC sp_executesql @sSql
--EXEC(@sSql)

et s'il s'exécute sans erreurs, je constate après coup que les données
devant être insérées dans la table MyOtherTable de la base distante ne s'y
trouvent pas.

Par contre, si je remplace le :
EXEC sp_executesql @sSql
de la fin par un
SELECT @sSql
les commandes INSERT fabriquées dynamiquement sont alors affichées. Et si
alors je les copie une par une et que je les exécute, tout fonctionne, je
n'ai pas de messages d'erreur, et les données sont bien insérées dans la
table MyOtherTable.

Y a t-il une raison pour lauqelle la commande EXEC sp_executesql @sSql ne
marcherait pas, alors qu'en faisant les insertions "à la main" cela
fonctionne, preuve que la construction dynamique de mes requêtes est
syntaxiquement correcte ?

FYI, j'ai aussi essayé de remplacer EXEC sp_executesql @sSql par
EXEC(@sSql) mais sans que cela ne change rien au résultat ...

Merci de votre aide.




WonderMan
Le #11879501
Bonjour,

La virgule après Field4 a été rajoutée accidentellement en écrivant le
message, mais ne figure pas dans le code original.
Quant au SELECT, il retourne bien la ligne qu'il doit retourner.

Après mûre réflexion, Patrice a écrit :
Cela semble pourtant ne pas être syntaxiquement correct ( virgule après
Field4 ?) plus je commencerais par vérifier que le select sélectionne bien
une ligne (et pourquoi mettre le select entre parenthèse).

Egalement la stratégie habituelle est d'imprimer @sSql et de l'exécuter à la
main pour voir de quoi il retourne en exécutant exactement cette chaîne.

--
Patrice

"WonderMan" :
Bonjour,

Je développe une série de procédures stockées qui s'appellent les unes les
autres sous MS SQL Server 2005.

A un moment donné, j'arrive à ce code :

DECLARE @sSql AS NVARCHAR(1000)
DECLARE @SystemName as VARCHAR(200)
DECLARE @CatalogName as VARCHAR(200)

(@fieldID est un INT qui contient une valeur passée en paramètre qui est
conforme à ce qu'on attend)

SET @SystemName = 'SERVER_NAME" -- Nom du serveur
SET @CatalogName = 'DATABASE_NAME' -- Nom de la base

SET @sSql = N'INSERT INTO ['
SET @sSql = @sSql + @SystemName + '].'
SET @sSql = @sSql + @CatalogName
SET @sSql = @sSql + '.dbo.MyOtherTable ('
SET @sSql = @sSql + 'Field1,Field2,Field3,Field4)'
SET @sSql = @sSql + ' (SELECT Field1,Field2,Field3'
SET @sSql = @sSql + ',Field4,FROM MyTable WHERE Field_ID = '
SET @sSql = @sSql + CAST(@fieldID AS VARCHAR(10))
SET @sSql = @sSql + ')'
EXEC sp_executesql @sSql
--EXEC(@sSql)

et s'il s'exécute sans erreurs, je constate après coup que les données
devant être insérées dans la table MyOtherTable de la base distante ne s'y
trouvent pas.

Par contre, si je remplace le :
EXEC sp_executesql @sSql
de la fin par un
SELECT @sSql
les commandes INSERT fabriquées dynamiquement sont alors affichées. Et si
alors je les copie une par une et que je les exécute, tout fonctionne, je
n'ai pas de messages d'erreur, et les données sont bien insérées dans la
table MyOtherTable.

Y a t-il une raison pour lauqelle la commande EXEC sp_executesql @sSql ne
marcherait pas, alors qu'en faisant les insertions "à la main" cela
fonctionne, preuve que la construction dynamique de mes requêtes est
syntaxiquement correcte ?

FYI, j'ai aussi essayé de remplacer EXEC sp_executesql @sSql par
EXEC(@sSql) mais sans que cela ne change rien au résultat ...

Merci de votre aide.






Publicité
Poster une réponse
Anonyme