Cautare string intre doi delimitatori

Am fost nevoit uneori sa extrag din coloana unei tabele (de tip varchar) toate caracterele delimitate de un anumit separator. (cel mai des mi s-a intamplat la importul in sql de csv-uri)

Pentru aceasta am creat o functie care primeste parametrii:

– un strig (sau o coloana de tip varchar dintr-o tabela)

– un parametru de tip varchar (care poate sa fie un caracter sau un sir de caractere) care este delimitatorul din stanga

–  un alt  parametru de tip varchar (care poate sa fie un caracter sau un sir de caractere) care este delimitatorul din dreapta

Functia intoarce toate stringurile gasite intre cele doua delimitatoare (parametrii 2 si 3)

– functia mai are si doi parametrii suplimentari in care se poate seta comportamentul functiei in cazul in care nu sunt gasite stringurile delimitatoare

@StringNu –

daca se pune null , si delimitatorul stanga exista,  dar nu exista delimitatorul dreapta, atunci functia returneaza de la delimitatorul gasit pana la sfarsitul stringului.

daca se pune null , si delimitatorul stanga nu exista, dar exista delimitatorul dreapta, atunci functia returneaza de la inceputul stringului pana la delimitatorul dreapta.

daca se pune altceva decat null la acest prametru, este afisat acel altceva in cazul in care nu exista delimitatorul stanga, sau dreapta ori ambele.

@Off –

in mod normal acest parametru se pune cu valoarea 0

in mod special se pune cu alta valoare decat cea 0 DOAR in cazul in care , daca exista si delimitatorul stanga si cel dreapta , se vrea afisarea si inceputului stringului (aflat la stanga de delimitatorul stanga) daca stringul cautat este gasit de la pozitia @Off in sus

Exemplu (ca sa fie mai clar)

Am stringul urmator:

‘dadadadadaaasu#dfffgggg!gdfhdhh4555’

select dbo.fn_BD_StringIntreDelimitatori ( ‘dadadadadaaasu#dfffgggg!gdfhdhh4555’, ‘#’, ‘!’ , 0, null)    intoarce rezultatul  dfffgggg

select dbo.fn_BD_StringIntreDelimitatori ( ‘dadadadadaaasu#dfffgggg!gdfhdhh4555’, ‘#’, ‘!’ , 15, null)    intoarce rezultatul  dfffgggg

DAR

select dbo.fn_BD_StringIntreDelimitatori ( ‘dadadadadaaasu#dfffgggg!gdfhdhh4555’, ‘#’, ‘!’ , 16, null) intoarce rezultatul  dadadadadaaasu#dfffgggg

[mai mult...]

Cautare a n-a aparitie intr-un string

M-am intalnit deseori cu problema de a cauta intr-un string sau o coloana de tip varchar a doua sau a treia recurenta a unui alt string.

Pentru aceasta situatie am facut o functie care cauta intr-un string (sau o coloana de tip varchar dintr-o tabela) a n-a apartie a unui sir de caractere.

Functia are 3 parametrii:

– un parametru de tip varchar ce reprezinta stringul cautat

– un parametru de tip varchar ce reprezinta stringul (sau coloana din tabela) in care se face cautarea

– un parametru de tip int ce reprezinta a cata apartiei a primului parametru in cel de-al doilea parametru este cautata

[mai mult...]

Cautare numere lipsa in coloana

Avem nevoie uneori sa gasim valorile lipsa (sau plaja de valori lipsa dintr-o coloana de tip integer)

Pt aceasta situatie am creat un script care parcurge o coloana de tip INTEGER si intoarce valorile lipsa din aceasta coloana , mai exact intoarce, pt fiecare serie de numere lipsa, numarul de start  al seriei lipsa, numarul de sfarsit al seriei lipsa si lungimea seriei care lipseste.

In scriptul de mai jos trebuie doar sa inlocuiti NUMELE TABELEI si NUMELE COLOANEI din tabela respectiva.

Cele doua locuri in care se fac inlocuirile sunt marcate cu comentarii pt a fi vizibile.

[mai mult...]

Generator de parole

Sunt cazuri in care avem nevoie sa punem parole pt diferite servicii (sau chiar si pt useri cu drepturi mai mari) si vrem sa fie o parola care sa fie puternica si sa nu fie usor de spart.

In cazul in care nu avem inspiratie , am creat in TSQL un generator de parole care primeste urmatorii parametri:

@useNumbers   de tip bit   – daca are valoarea 1 se vor folosi numere la generarea parolei, daca are valoarea 0 nu se vor folosi numere la generarea parolei

@useLowerCase de tip bit – daca are valoarea 1 se vor folosi litere mici la generarea parolei, daca are valoarea 0 nu se vor folosi litere mici la generarea parolei

@useUpperCase de tip bit – daca are valoarea 1 se vor folosi litere mari la generarea parolei, daca are valoarea 0 nu se vor folosi litere mari la generarea parolei

@charactersToUse de tip varchar – daca se pune null se vor folosi toate literele alfabetului, daca nu se doreste asta se poate pune un string din care se vor alege caracterele pt generarea parolei

@specialCharacters de tip bit – daca are valoarea 1 se vor folosi si caractere speciale la generarea parolei, daca are valoarea 0 nu se vor folosi caractere speciale

@passwordLength de tip int – lungimea parolei

 

Procedura are inca un parametru de tip OUT si se apeleaza astfel:

declare @a varchar(10)    — unde @a este lungimea parolei
EXEC BD_GeneratorParola 1,1,1,null, 1, 10,@a OUT
PRINT @a

[mai mult...]

Disable sql logins

Avem nevoie uneori sa dam disable rapid la toti logins de sql , mai putin la cei care sunt sysadmin, pentru diferite operatiuni de mentenanta sau mai grav, pentru cazul in care ceva a fost alterat gresit in baza si e nevoie de un restore.

Pentru aceasta situatie am facut procedura de mai jos.

[mai mult...]

Top 10 tabele dupa dimensiune

Pentru cazurile in care avem nevoie sa aflam care sunt tabelele cu cea mai mare dimensiune dintr-o baza am facut o procedura care returneaza acest top in functie de un parametru, @rows.

Daca @rows = 1 atunci se returneaza top 10 in functie de numarul de linii din tabela.

Daca @rows = 0 atunci se returneaza top 10 in functie de dimensiunea (exprimata in kb) tabelelor.

[mai mult...]

Cautare a n-a cea mai mica\mare valoare

Uneori avem nevoie sa cautam intr-o coloana de timp integer / numeric / decimal   maximul sau minimul valorii din acea coloana. Solutia este simpla in acest caz, pentru ca vom scrie un query ca acesta:

select min(Coloana) from tabela

sau

select max(Coloana) from tabela

dupa caz.

Dar ce ne facem daca avem nevoie sa gasim a doua valoare ca marime, sau a treia, etc ?

[mai mult...]

Cautare dupa un caracter special intr-o coloana

Limbajul T-SQL are o serie de caractere speciale ce pot fi folosite in diverse situatii.

Problema apare cand avem nevoie sa cautam, intr-o coloana de tip textvarchar dupa unul sau mai multe dintre aceste caractere. Sa luam ca exemplu caracterul special %  care in T-SQL este partial similar cu LIKE.

Daca, spre exemplu, vrem sa cautam intr-o tabela, pe coloana NUME, toate numele care se termina cu -escu, vom scrie un query de genul:

select * from tabela where NUME like ‘%escu’

care va returna toate numele care se termina exact cu escu.

Pe de alta parte, daca, spre exemplu vrem sa cautam toate numele care contin stringul stan (ex: Stanescu, Constantin) o sa scriem un query de genul:

select * from tabela where upper(NUME) like ‘%stan%’

care va returna toate numele ce contin stan (si care nu va tine cont de caractere mici sau mari).

Dar ce se intampla daca avem o coloana ce contine caracterul special si avem nevoie sa cautam caracterul % ?

[mai mult...]

Cum aflam numarul de cuvinte dintr-un text

Pentru cazurile in care avem nevoie sa aflam numarul cuvintelor dintr-un text sau coloana.

Am conceput o functie ce numara cate cuvinte sunt intr-un text ce este primit ca parametru de functie (care desigur, poate fi si o coloana de tip text dintr-o tabela). Eu am avut nevoie de o asemenea functie in momentul in care a trebuit sa trimitem scrisori catre clienti, si plata catre furnizor se facea (si) in functie de numarul de cuvinte.

[mai mult...]

Determinare an bisect

M-am lovit de multe ori de situatia in care aveam nevoie sa calculez numarul de zile din an (pt a calcula dobanda pana la sfarsitul anului sau pt tot felul de operatii) si de fiecare data trebuia sa stiu daca anul este bisect sau nu. Pentru aceasta am facut o functie care primeste ca parametru o data calendaristica si calculeaza daca anul corespunzator acelei date calendaristice este sau nu bisect.

[mai mult...]