PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → UPDATE FROM et différences entre MSSQL MicrosoftSL SQL Server et Hyperfile HFSQL
UPDATE FROM et différences entre MSSQL MicrosoftSL SQL Server et Hyperfile HFSQL
Iniciado por AlexisPERR, jul., 24 2024 6:45 PM - 3 respostas
Membro registado
107 mensagems
Publicado em julho, 24 2024 - 6:45 PM
J'utilise extensivement l'objet Requête SQL
maReq is SQL Query =
[
SELECT NOM
FROM CLIENT
WHERE IDCLIENT = 3
]


et la plupart du temps le code est portable, entre les databases SQL Server et les bases Hyperfile.

Quelque cas cependant demandent une adaptation du code SQL, par exemple les mémo texte doivent être converti.

Ainsi, alors qu'en Hyperfile vous pouvez écrire

WHERE CLIENT.COMMENTAIRE LIKE 'casse bonbon'


en SQL Server il faut utiliser SUBSTRING DATALENGTH sur les mémos texte :

WHERE SUBSTRING(CLIENT.COMMENTAIRE,1,DATALENGTH(CLIENT.COMMENTAIRE)) LIKE 'casse bonbon'


Une autre différence notable est le UPDATE FROM

En Hyperfile on peut faire

maReq is SQL Query =
[
UPDATE CLIENT
LEFT OUTER JOIN PAYS ON PAYS.IDPAYS = CLIENT.IDPAYS
SET CLIENT.DONE = 1
WHERE PAYS.IDPAYS = 33
]


en SQL Server

maReq is SQL Query =
[
UPDATE CLIENT
SET CLIENT.DONE = 1
FROM PAYS
WHERE PAYS.IDPAYS = 33
AND PAYS.IDPAYS = CLIENT.IDPAYS
]


Malheureusement, comme cette syntaxe est inconnue de WinDEV, il faut passer par HExecuteSQLQuery avec l'option hQueryWithoutCorrection
Mensagem modificada, julho, 24 2024 - 6:46 PM
Membro registado
2.676 mensagems
Publicado em julho, 25 2024 - 8:05 AM
Bonjour,

Lorsque tu passes d'un SGBD à un autre, tu as toujours des différences. C'est vrai entre HFSQL et SQL Server, mais aussi entre SQL Server et PostgreSQL ou encore entre SQL Server et Oracle...
HFSQL respecte la norme SQL92. Aujourd'hui nous en sommes à SQL-2019 et la 2023 devrait voir le jour d'ici peu.
Au final si tu veux baser d'une base à une autre, tu ne peux pas avoir de requêtes identiques tout le temps. A toi de jongler entre les les différents systèmes.

En dehors de ceci, plusieurs choses :
1 - Ecrire ceci revient à écrire une égalité
WHERE CLIENT.COMMENTAIRE LIKE 'casse bonbon'

// est identique à

WHERE CLIENT.COMMENTAIRE = 'casse bonbon'

Si HFSQL arrive à te sortir quelque chose correspondant à un "LIKE '%casse bonbon%'", c'est qu'il y a un bug dans HFSQL.

2-
par exemple les mémo texte doivent être converti

En SQL Server, un "mémo texte" n'est ni plus ni moins qu'un varchar(max) (https://learn.microsoft.com/fr-fr/sql/t-sql/data-types/char-and-varchar-transact-sql…). Il n'a nul besoin d'être converti pour être utilisé avec un "LIKE". Par contre il te faut respecter un pattern cohérent comme ceci (https://learn.microsoft.com/fr-fr/sql/t-sql/language-elements/like-transact-sql…)
WHERE CLIENT.COMMENTAIRE LIKE '%casse bonbon%'


3- Ecrire un "left outer join" avec une égalité dans le "where" revient à faire un "join"
maReq is SQL Query =
[
UPDATE CLIENT
LEFT OUTER JOIN PAYS ON PAYS.IDPAYS = CLIENT.IDPAYS
SET CLIENT.DONE = 1
WHERE PAYS.IDPAYS = 33
]
// est identique à

maReq is SQL Query =
[
UPDATE CLIENT
JOIN PAYS ON PAYS.IDPAYS = CLIENT.IDPAYS
SET CLIENT.DONE = 1
WHERE PAYS.IDPAYS = 33
]


--
Cordialement,

Philippe SAINT-BERTIN
Membro registado
107 mensagems
Publicado em julho, 25 2024 - 1:57 PM
Le problème du UPDATE FROM est qu'il est implémenté de façon diverse par les différents SGDB.
En effet il ne fait pas partie du SQL92
https://www.contrib.andrew.cmu.edu/%7Eshadow/sql/sql1992.txt
(page 391)

Ainsi chacun le fait à sa sauce

--SQL Server

UPDATE Table2
SET Table2.Sort = Table1.Sort
FROM Table2 t2
INNER JOIN Table1 t1 ON t1.id=t2.id_Table1

--PostgreSQL

UPDATE Table2 t2
SET t2.Sort = t1.Sort
FROM Table1 t1
WHERE t1.id=t2.id_Table1

--MySQL / MariaDB / Hyperfile

UPDATE Table2 t2
INNER JOIN Table1 t1 on t1.id=t2.id_Table1
SET t2.Sort = t1.Sort


WinDEV ne reconnaissant pas la syntaxe avec FROM, donne une erreur de compilation. Dommage.
Membro registado
2.676 mensagems
Publicado em julho, 25 2024 - 2:22 PM
WinDEV ne reconnaissant pas la syntaxe avec FROM, donne une erreur de compilation. Dommage.


Et à mon avis, c'est pas près de changer

--
Cordialement,

Philippe SAINT-BERTIN