• 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

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

 

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

 

 

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