MySQL tárolt eljárás átfordítása MSSQL-be

MySQL tárolt eljárás átfordítása MSSQL-be
2017-04-23T20:20:38+02:00
2017-04-25T21:58:17+02:00
2022-12-04T12:50:42+01:00
peace_war2
Van jó sok MySQL tárolt eljárás, amit át kell fordítanom MSSQL-be. Ezért most ismerkedem a TSQL-el és a MSSQL szintaxisával.
A kérdésem, hogy az eljárásban lévő változó definíciókat hogyan tudnám a lehető legegyszerűbben érvényesíteni az MSSQL scriptben (lekérdezésben). Példa alább. Előre is nagyon köszönöm, ha tudtok segíteni! Az alábbi kód egy scriptben lévő      "create table as select........"    lekérdezés részlete, ahol ugye a MySQL-ben nem kell előre definiálni a változót és a mező típusát. Az ifnull átfordítása megy a " case......when"   formulával.



@d081_term:=ifnull(t8_a.m8013_03,0) as d081_term,
@d082_term:=ifnull(t8_a.m8007_03,0) as d082_term,
if(left(@d081_term,1)<>2,
@d081:=ifnull(t8_a.m8013_04,0),@d081:=0) as d081,
if(left(@d082_term,1)<>2,
@d082:=ifnull(t8_a.m8007_04,0),@d082:=0) as d082,
@d08:=@d081+@d082 as d08,
Mutasd a teljes hozzászólást!
Akkor neked a Common Table Expression -re van szükséged. Ezzel egy selectben oldhatsz meg elég bonyolult lekérdezéseket is. Tulajdonképpen virtuális temp táblákkal.
Mutasd a teljes hozzászólást!

  • ifnull helyett van isnull és colaesce függvények.

    a create table as select helyett pedig:
    select ... from table into newtable where...
    ez az utasitás létrehozza a táblát a megfelelő mezőnevekkel és azok tipusával.

    @d081_term:= ifnull(..) as d108_term esetében pedig:
    isnull(...) as d108_term,
    Mutasd a teljes hozzászólást!
  • Köszi a választ. Egyetlen probléma maradt csak, hogy a tárolt eljárásban a selectben nem hagyja az előre definiált változónak történő értékadást, hogyha a selectben van visszatérési érték (pl. lekérdezett mező) is. Pl.

    DEF $valtozo1 float

    select
    mezo1,
    $valtozo1=mezo2 as valtozo1
    case when $valtozo1=1 then 'igen' else 'nem' as nev
    from tabla;



    Pedig ez MySQL-ben nem okoz problémát. Ezt meg lehet-e oldani valamilyen, hasonló módon? Mert ha nem, akkor kénytelen leszek a feldolgozás lépéseit egy-két számított táblával bővíteni. Előre is köszi a segítséget.
    Mutasd a teljes hozzászólást!
  • Először is nem $, hanem @ az eleje a változónak TSQL-ben.
    Másrészt az as valtozo1 nem kell és teljesen felesleges is. És van még pár apróság, amit módositanod kell:

    declare @valtozo1 numeric(19, 6)
    select mezo1, @valtozo1 = mezo2
    case when mezo1 = 1 then 'igen' else 'nem' end as nev
    from table;

    Azt nem tudom, hogy ez megy-e egyszerre:
    select mezo1, @valtozo1 = mezo2
    Igy még soha nem használtam, én nem is tudok elképzelni olyan esetet, amikor igy használnám.
    vagy:
    select mezo1, mezo2
    vagy:
    select @valtozo1 = mezo1, @valtozo2 = mezo2
    Mutasd a teljes hozzászólást!
  • Köszi a választ. A $ jel egy berögződés, mert sok nyelvben ez a változók jelölése és erre nem figyeltem a példában. Amit írtál, hogy nem próbáltad még egy selectben a változót és a mező visszatérési értéket, hát ez a probléma. Szóval egy MySQL scriptben megoldható az, hogy egy selecten belül kiszámítok egy értéket, amit betöltök egy előre nem definiált változóba (amit ugyan egy mezőben rögzítenem is kell, amit egyébként majd a select után drop-olok, ha nincs rá szükség), de utána ezzel a változóval tovább számolhatok a select-ben. Így egészen bonyolult számításokat is el tudok végezni egyetlen SELECT-en belül. Erre keresek megoldást a TSQL-ben, mert szeretném a lehető legegyszerűbb, időtakarékos módban átfordítani a scriptjeimet. Egyébként más adatbázis rendszerekben PHP-val könnyedén megoldottam ezeket a feladatokat. DE.... A cégnél elég nem körültekintő módon ránk ültették a Microsoft vállaltirányítási, meg minden egyéb rendszereket, és próbálok előre dolgozni, mert itt nem lesz lehetőségem PHP-t használni. Még csak három hete kezdtem el a MSSQL, POWER BI, meg mindenféle Analysis, report meg minden szentszar szerverekkel foglalkozni. Egyébként meg  lehet csinálni a scripteket ilyen megoldás nélkül is (bár jobb lenne), csak plussz egy-két lépés, temp table. De ez több idő.......
    Mutasd a teljes hozzászólást!
  • Akkor neked a Common Table Expression -re van szükséged. Ezzel egy selectben oldhatsz meg elég bonyolult lekérdezéseket is. Tulajdonképpen virtuális temp táblákkal.
    Mutasd a teljes hozzászólást!
  • Köszönöm szépen a segítségedet! Nagyon előremutató volt számomra. Úgy néz ki, mindent meg tudtam oldani, amit akartam! A CTE-t is kipróbáltam. Még egyszer köszi. Ott a pont.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd