• 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

Příkazem SUBSTRING lze vykopírovat část řetězce. První parametr příkazu udává první kopírovaný znak, druhý parametr počet znaků.

 

DECLARE @text nvarchar(15) = 'Ahoj Čau Nazdar'

SELECT SUBSTRING(@text,6,3) AS Výsledek

 

Výsledek:

 

Občas se stane, že v selectovaných datech jsou skryty znaky pro formátování textu (odřádkování, tabulátory,..) To může být nevhodné pokud tato data exportujete do textového souboru, tisknete apod.

Jedná se hlavně o tyto znaky:

CHAR(9) - tabulátor
CHAR(10) - konec řádku (LF)
CHAR(13) - návrat vozíku (CR)

Lze to vyřešit tím, že znaky vymažeme pomocí funkci REPLACE (defacto je nahradíme za prázdnou hodnotu).

 

DECLARE @Text nvarchar(max)
SET @Text = 'Ahoj ' + CHAR(10) + CHAR(13) + 'Druhy radek'

SELECT REPLACE (REPLACE(@Text,CHAR(10),''),CHAR(13),'')

Tímto skriptem lze exportovat data z určité tabulky do CSV souboru (pokud potřebujete exportovat určitý select, je potřeba vytvořit pomocnou tabulku a tu pak exportovat)

DECLARE 
@SQL nvarchar (MAX),
@CMD nvarchar (500),
@Path nvarchar (200)

-- vytvoření selectu do tabulky TabData
SET @SQL = 'SELECT * FROM ' + DB_NAME()  +'.dbo.TabData'

-- cesta pro uložení + název souboru
SET @Path = (SELECT 'D:\EXPORT\export-file.csv')

-- sestavení celého příkazu
SELECT @CMD =  'bcp " ' + @SQL + ' " queryout ' + @Path  + '  -c -t; -T -S  '

-- export pomocí procedury xp_cmdshell
EXEC master..xp_cmdshell @CMD

 

V následujícím příkladu uvádím možnost jak vytvořit název souboru pomocí datumu a času (např. pro 10.5.2018 v 12 hod 50 min 30 sec to bude 2018-05-10-12-50-30) 

 

DECLARE 
@SQL nvarchar (MAX),
@CMD nvarchar (500),
@Path nvarchar (200)

SET @SQL = 'SELECT * FROM ' + DB_NAME()  +'.dbo.NypTabExportFB'

SET @Path = (SELECT 'D:\EXPORT\' + REPLACE(REPLACE(convert(nvarchar(20),GetDate(),120),':','-') ,' ','-')+'.csv')

SELECT @CMD =  'bcp " ' + @SQL + ' " queryout ' + @Path  + '  -c -t; -T -S  '

EXEC master..xp_cmdshell @CMD

 

Samozřejmostí je nutnost oprávnění pro xp_cmdshell (pozor na bezpečnostní riziko)

 

Občas je zapotřebí do výpočtu použít rozsah prvního a posledního dne v roce. Toto lze získat následujícími skripty.

 

Př.1 - vstupní proměnná je rok ve formátu čísla např. 2016

DECLARE @Rok int
SET @Rok = 2016

-- první den v roce
SELECT  DATEADD(yy, @Rok-1900,0) 

-- poslední den v roce
SELECT  DATEADD(yy, @Rok-1899,0)-1

 

 

 

Př.2 - vstupní proměnná je datum v našem případě aktuální datum

DECLARE @Datum date
-- aktuální datum
SET @Datum = GETDATE()

-- první den aktuálního roku
SELECT DATEADD(yy, DATEDIFF(yy, 0, @Datum),0)

-- poslední den aktuálního roku
SELECT DATEADD(yy, DATEDIFF(yy, 0, @Datum) + 1, -1)

 

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

 

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