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 ...
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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" <none@none.com> a écrit dans le message de groupe de discussion
: mn.d40f7d8517a44584.88081@none.com...
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 ...
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.
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.
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" <none@none.com> a écrit dans le message de groupe de discussion
: mn.d40f7d8517a44584.88081@none.com...
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 ...
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 ...