2016. február 19., péntek

Hasznos MSSQL infók

Megosztom veletek az elmúlt napok tapasztalatát az MSSQL világából, hátha hasznos lesz nektek is:

Dinamikus SQL

Dinamikus SQL utasításba táblaváltozót (@ prefix) nem lehet átadni kimeneti paraméterként, viszont léteznek megkerülő megoldások. 

  • Az egyik a temp tábla (# prefix) használata, ami addig létezik, amíg az adott session tart vagy el nem dobtuk, emiatt elérhető a dinamikus SQL scope-jában is

CREATE TABLE #t ( id INT ) DECLARE @q NVARCHAR(MAX) = 'insert into #t values(1),(2)' EXEC (@q) SELECT * FROM #t

  • Táblaváltozót használunk amibe beleszúrjuk a dinamikus SQL futási eredményét

DECLARE @t TABLE ( id INT ) DECLARE @q NVARCHAR(MAX) = 'declare @t table(id int)
                            insert into @t values(1),(2)
                            --itt a lényeg:                            select * from @t'INSERT INTO @t EXEC(@q) SELECT * FROM @t


Nem mindegy, hogy az EXEC (@SQL) vagy az EXEC @SQL utasítást használjuk. Első esetben a @SQL változó tartalmát utasításként értelmezi, ezzel szemben az utóbbinál pedig a @SQL változó tartalmának megfelelő nevű tárolt eljárást akarja futtatni.

Konkatenálás vs Concat

Az SQL nem végez automatikus típuskonverziót konkatenációnál, ami nem baj, de nem árt fejben tartani, mert körülményes lehet utólag átírni egy dinamikus SQL kifejezést a Concat függvényre egy int változó miatt. 

Linked Server

Linked serveren keresztül nem lehet ki-/bekapcsolni az IDENTITY_INSERT tulajdonságot. Ha mégis elkerülhetetlen, akkor létre kell hozni egy tárolt eljárást a célrendszeren, ami beállítja és azt kell meghívni távoli eljárásként. Egy másik korlátozás, hogy nem használható az OUTPUT clause.

SQL Server Alias

SQL alias beállításánál a SERVER-nek hiába van a gépnév mellett megadva a kívánt SQL instance neve is, mivel a gépnév + portszám párost veszi figyelembe. Ezen infó nélkül, ha úgy állítjuk be az aliasokat, hogy RemoteHost\Instance1, RemoteHost\Instance2 és mindkettő az 50000 porton figyel, akkor minden gond nélkül mindkét esetben ugyanarra fog mutatni. A port beállításához leírás itt található.

Cursor

Egyazon Cursort többször is fel lehet használni, ha korábban már le lett zárva és fel lett szabadítva.


Nincsenek megjegyzések:

Megjegyzés küldése