• aaa

    Poznávačka krás Maďarska - toulání po severu 

  • CAT700

    Non-stop adventure závod přes Katalánsko - z Pyrenejí až k moři

  • Toulání Šumavou
    Toulání Šumavou

    Extrémní non-stop MTB závod

  • 1000 miles
    1000 miles

    Non-stop extrémní adventure závod napříč Československem by Jan Kopka

  • Bohemia Divide 2019

    Non-stop bike packing závod 700km dlouhý z nejjižnějšího do nejsevernějšího místa ČR 

A A A

Kurzory slouží pro sekvenční zpracování vybraných dat. Do dočasné tabulky se načtou data a nad nimi se provádí daná sekvence příkazů (uzavřených do bloku BEGIN ... END)

Pro lepší představu uvedu příklad použití:
V informačním systému potřebuji spočítat marži nad fakturami. Faktura obsahuje položky, na kterých je uvedena prodejní cena. Abych zjistil marži položky je třeba provést nad položkami několik výpočtů. Řešení: Kurzor načte do dočasné tabulky všechny položky označených faktur a pak je postupně prochází a nad každým provede sekvenci výpočtů . Po provedení výpočtů nad jedním řádkem se se přesune na řádek další.

Kurzor prochází postupně jednotlivé řádky výběru (použitím příkazu FETCH NEXT viz.příklad). Můžeme ale použít i tyto příkazy:
FETCH PRIOR (předchozí řádel)
FETCH LAST (poslední řádek)
FETCH FIRST (první řádek)

-- proměnné
DECLARE @IDPolozky int, @ProdejniCena numeric(19,2)  
 
-- deklarace kurzoru
DECLARE cur_vypocet CURSOR FOR					

-- data nad kterými bude kursor dělat výpočty
SELECT ID, Cena FROM TabPolozkyFaktur WHERE CisloFaktury = 2222
 
-- otevření kursoru
OPEN cur_vypocet
 
-- skok na první řádek a načtení dat do proměnných
FETCH NEXT FROM cur_vypocet INTO @IDPolozky, @ProdejniCena	
 
-- pokud je úspěšné načtení proměnných (status 0) tak proveď příkazy
WHILE @@FETCH_STATUS=0						
 
  BEGIN
    -- příkazy které provádíme
    -- skok na další řádek a načtení dat do proměnných 
    FETCH NEXT FROM cur_1 INTO @IDPolozky, @ProdejniCena
  END   

-- uzavření kurzoru 
CLOSE cur_vypocet 

-- uvolnění z paměti 
DEALLOCATE cur_vypocet

 

Tímto scriptem lze z SQL serveru získat jaký den v týdnu je dané datum. V příkladu zjišťuji aktuální den.
Jelikož má SQL server v defaultu hodnotu, že první den v týdnu je neděle, musíme ošetřit tento stav viz.příklad 2. V příkladu 3 potom daný den pojmenujeme.

 

-- declarace proměnné datum a naplnění hodnotou akt.datum
DECLARE @Datum datetime
SET @Datum = getdate()
 
-- př.1: den v týdnu
SELECT DATEPART(dw,@Datum)
 
-- př.2: den v týdnu s ošetřením lokálního prostředí
SELECT (DATEPART(dw,@Datum)+@@DATEFIRST-2)%7+1
 
-- př.3: den v týdnu česky
SELECT CASE ((DATEPART(dw,@Datum)+@@DATEFIRST-2)%7+1)
WHEN 1 THEN 'Pondělí'
WHEN 2 THEN 'Úterý'
WHEN 3 THEN 'Středa'
WHEN 4 THEN 'Čtvrtek'
WHEN 5 THEN 'Pátek'
WHEN 6 THEN 'Sobota'
WHEN 7 THEN 'Neděle'
END

 

Výsledek:

V praxi narazíte na případ, kdy je třeba SQL scriptem zkopírovat popř.přesunout soubor z jednoho adresáře do jiného. Podobnou situaci jsem řešil v informačním systému, kdy jsem potřeboval určité soubory zkopírovat/přesunout do jiného adresáře. Pokud tedy nechcete psát nějaké pluginy a chcete to řešit SQL scriptem, jako já, můžete použít následující příklad. Vstupní proměnné jsou cesta k souboru vč.názvu souboru a cílový adresář.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DECLARE
@From nvarchar(200), 
@ToFolder nvarchar(200), 
@FileName nvarchar(50),
@SQL nvarchar(500)   
 
-- zdrojový soubor
SET @From = '\\server\data\old\test001.pdf'
-- cílový adresář
SET @ToFolder = '\\server\data\new\'
       
-- název souboru
SELECT @FileName = REVERSE(LEFT(REVERSE(@From),
                   CHARINDEX('\',REVERSE(@From),1)- 1))
 
SET  @sql = 'copy ' + @From + ' ' + @ToFolder + @FileName 
 
EXEC master.dbo.xp_cmdshell @SQL

 

 

Tímto scriptem vykopírujeme název souboru z celé cesty k souboru

1
2
3
4
5
DECLARE @PathFile varchar(255)
SET @PathFile = '\\SERVER\DATA\soubor20180220.txt'
 
SELECT FileName= REVERSE(LEFT(REVERSE(@PathFile),
                 CHARINDEX('\',REVERSE(@PathFile),1)- 1))

 

Výsledek

Někdy nastanou situace, kdy je třeba zjistit délku názvu souboru z celé cesty k souboru. 
To lze provést celkem jednoduše. Nejprve otočíme řetězec funkcí REVERSE a potom spočítáme pořadí prvního lomítka zleva (začátek názvu souboru) funkcí CHARINDEX a poté odečteme jeden znak.

1
2
3
4
DECLARE @PathFile varchar(255)
SET @PathFile = '\\SERVER\DATA\soubor20180220.txt'
 
SELECT CHARINDEX('\',REVERSE(@PathFile),1) -1 

 

Výsledek

 

 

 

Původně to měla být kategorie o cestách, které podniknu na svém starém kole-dědkovi. Pak se mě název zalíbil a říkám si, že jednou budu taky dědek, vlastně syna už na to mám dost velkýho, a tak nadčasově tuto kategorii nechám pojmenovanou takto. Takže zde nalezneš zápisky z cest. 

Zde je můj blog o SQL. Je to takový můj tahák.

Moje poznámky z instalací

Search