Requête SQL vers la source de données ODBC / serveur SQL avec des tables temporairesChère communauté,
Je construis un script SQL où j'utilise des tables temporaires sur le serveur SQL. L'exemple de script simplifié ci-dessous (qui fonctionne bien ailleurs) s'exécute sans erreur mais ne renvoie PAS de données (c'est-à-dire que la table de données JMP ne s'affiche pas).
query= "
CREATE TABLE #tmpTable (ID int PRIMARY KEY NOT NULL, WaferNum int NOT NULL);
INSERT INTO #tmpTable (ID, WaferNum) (
SELECT
ID,
WaferNum
FROM WareHouse
);
SELECT * FROM #tmpTable;
DROP TABLE #tmpTable;
";
dbc = Create Database Connection(
"DSN=DatabaseName; ... ; UID=email@abc.com;"
);
Execute SQL (dbc, query);
close database connection(dbc);
Ma prochaine itération consistait à diviser l'exécution comme ci-dessous; cette astuce a été mentionnée sur un fil.
query1= "
CREATE TABLE #tmpTable (ID int PRIMARY KEY NOT NULL, WaferNum int NOT NULL);
INSERT INTO #tmpTable (ID, WaferNum) (
SELECT
ID,
WaferNum
FROM WareHouse
);
";
query2= "
SELECT * FROM #tmpTable
DROP TABLE #tmpTable;
";
query3= "
DROP TABLE #tmpTable;
";
dbc = Create Database Connection(
"DSN=DatabaseName; ... ; UID=email@abc.com;"
);
Execute SQL (dbc, query1);
Execute SQL (dbc, query2, "Table");
Execute SQL (dbc, query3);
close database connection(dbc);
Désormais, la fenêtre de journal JMP capture les messages du serveur SQL (sans les données renvoyées) : Nom d'objet invalide #tmpTable et Impossible de supprimer la table #tmpTable car elle n'existe pas.
J'utilise JMP16. Tous les conseils sont très appréciés.
Tableau de donnéesScriptRe : Requête SQL vers la source de données ODBC / le serveur SQL avec des tables temporairesSalut Janel,
J'espère que ce n'est pas ce vieux problème https://community.jmp.com/t5/Discussions/Importing-SQL-using-a-temp-table/mp/11760#M11264 . J'espère que quelqu'un d'autre sur le forum a utilisé les tables SQL Server Temp plus récemment avec JMP.
Brian Corcoran
Développement JMP
Re : Requête SQL vers la source de données ODBC / le serveur SQL avec des tables temporairesSalut Brian, Merci d'avoir pointé l'ancien fil; en effet très lié. Question passionnante !
J'ai effectué un débogage en consultant les journaux de test SQL Server que j'ai établis sur mon ordinateur portable. La première remarque est que la même requête (avec des tables temporaires ou des variables de table) exécutée à l'aide de la même connexion DNS/pilote ODBC dans Excel fonctionne correctement mais pas à partir de JMP. Lors de la recherche du trafic entrant sur le serveur, Excel envoie la chaîne de requête telle quelle (par exemple SÉLECTIONNER * À PARTIR DU Tableau ) mais depuis JMP, la requête arrive au format :
declare @p1 int
set @p1=1
exec sp_prepexec @p1 output,NULL,N'SELECT * FROM Table'
select @p1
Je crois que l'instruction SQL est enveloppée d'éléments supplémentaires par le pilote ODBC. Surtout le système procédure stockée sp_prepexec semble être celui qui cause des problèmes. Peut ou non être lié à des guillemets ; difficile de dire ce qui se passe réellement à l'intérieur de cette procédure.
Ok, c'est un problème de pilote ODBC. Cependant, à notre connaissance, ODBC permet également l'exécution directe. Je crois que c'est ce qui se passe avec Excel. Cela pourrait-il être également possible avec JMP ? Quelques liens connexes ci-dessous :
https://techcommunity.microsoft.com/t5/datacat/watch-out-those-prepared-sql-statements/ba-p/305074
https://docs.microsoft.com/en-us/sql/odbc/reference/develop-app/direct-execution-odbc?view=sql-server-ver15
Re : Requête SQL vers la source de données ODBC / le serveur SQL avec des tables temporairesJeanne,
Si vous modifiez votre premier SQL en :
query= "SET NOCOUNT ON;
CREATE TABLE #tmpTable (ID int PRIMARY KEY NOT NULL, WaferNum int NOT NULL);
INSERT INTO #tmpTable (ID, WaferNum) (
SELECT
ID,
WaferNum
FROM WareHouse
);
SELECT * FROM #tmpTable;
DROP TABLE #tmpTable;
";
dbc = Create Database Connection(
"DSN=DatabaseName; ... ; UID=email@abc.com;"
);
Execute SQL (dbc, query);
close database connection(dbc);
Vous devez importer la table dans JMP.
L'ajout, (au cas où il se serait perdu dans le JSL) est :
SET NOCOUNT ON ;
https://docs.microsoft.com/en-us/sql/t-sql/statements/set-nocount-transact-sql?view=sql-server-ver15
-Bryan
Re : Requête SQL vers la source de données ODBC / le serveur SQL avec des tables temporairesSalut Bryan,
Votre solution SET NOCOUNT ON ; fonctionne très bien!!! Je suis étonné de la simplicité de la solution. J'ai passé pas mal de temps à chercher la solution dans divers forums et discussions, mais personne n'a suggéré celui-ci.
Grand merci;
Jeanne