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

Requêtes construites dynamiquement ???

2 réponses
Avatar
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.

2 réponses

Avatar
Patrice
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" a écrit dans le message de groupe de discussion
:
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.




Avatar
WonderMan
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" a écrit dans le message de groupe de discussion
:
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.