7 Script-uri SQL la îndemână pentru dezvoltatorii SQL

Multe lucruri pe care le facem depind de cunoașterea pe care o avem. Dacă suntem conștienți de ceea ce se poate face, numai atunci putem lua decizii mai inteligente și mai eficiente. De aceea este întotdeauna bine să aveți sfaturi și trucuri rapide la îndemână în buzunar. Acest principiu se aplică peste tot, inclusiv pentru dezvoltatorii MS-SQL. 

Prin acest articol aș dori să împărtășesc câteva scripturi SQL care s-au dovedit a fi foarte utile pentru munca mea de zi cu zi ca dezvoltator SQL. Voi prezenta un scenariu scurt despre locul în care fiecare dintre aceste scripturi pot fi utilizate împreună cu scenariile de mai jos.

Notă: Înainte de a profita de avantajele acestor scripturi, este foarte recomandat ca toate scenariile furnizate să fie difuzate într-un mediu de testare înainte de a le rula într-o bază de date în timp real pentru a asigura siguranța.

1. Căutați text în interiorul tuturor procedurilor SQL

Ne putem imagina viața fără Control-F în lumea de astăzi? Sau o viață fără motoare de căutare! Dreaptă, nu-i așa? Acum, imaginați-vă că aveți 20-30 de proceduri SQL în baza de date și trebuie să găsiți procedura care conține un anumit cuvânt. 

Categoric, o modalitate de a face acest lucru este deschiderea fiecărei proceduri la un moment dat și efectuarea unui Control-F în cadrul procedurii. Dar aceasta este manuală, repetitivă și plictisitoare. Deci, aici este un script rapid care vă permite să realizați acest lucru.

SELECT DISTINCT o.name AS Object_Name, o.type_desc FROM sys.sql_modules m INNER JOIN sys.obiecte o ON m.object_id = o.object_id WHERE m.definition Like '% search_text%'

2. Comparați numărul de rânduri din tabele din două baze de date diferite cu aceeași schemă

Dacă aveți o bază de date mare și sursa de date pentru baza de date este un proces ETL (extract, transformare, încărcare) care rulează zilnic, acest script următor este pentru dvs.. 

Spuneți că aveți scripturi care rulează zilnic pentru a extrage date în baza dvs. de date și acest proces durează aproximativ cinci ore în fiecare zi. Pe măsură ce începeți să vă uitați mai profund în acest proces, găsiți câteva zone în care puteți optimiza scriptul pentru a termina sarcina în mai puțin de patru ore. 

Ați dori să încercați această optimizare, dar deoarece aveți deja implementarea actuală pe un server de producție, este logic să încercați procesul optimizat într-o bază de date separată, pe care să o replicați utilizând baza de date existentă. 

Acum, odată gata, ați rula atât procesele ETL, cât și datele extrase. Dacă aveți o bază de date cu mai multe mese, această comparație poate dura destul de mult. Deci, iată un script rapid care facilitează acest proces.

folosiți YourDatabase_1 CREATE TABLE #counts (nume_tabel varchar (255), row_count int) EXEC sp_MSForEachTable @ command1 = 'INSERT #counts (nume_tabel, numar_cad) SELECT "?", COUNT (*) FROM? utilizează YourDatabase_2 CREATE TABLE # counts_2 (nume_tabel varchar (255), row_count int) EXEC sp_MSForEachTable @ command1 = 'INSERT # counts_2 (nume_tabel, numar_cad) SELECT "?", COUNT (*) FROM? SELECT a.table_name, a.row_count ca [Counts from run normal], b.row_count ca [Counts from scripts mod], a.row_count - b.row_count ca [difference] FROM #counts un join intern # counts2 b pe. table_name = b.tabile_name unde a.row_count <> b.row_count ORDER BY a.table_name, a.row_count DESC

3. Faceți o copie de rezervă a mai multor baze de date simultan

În orice companie IT, primul lucru pe care un programator nou angajat (sau un dezvoltator sql) trebuie să îl facă înainte de a scrie prima sa interogare SQL este să cumpere asigurarea versiunii de lucru a bazei de date de producție, adică să facă o copie de rezervă.

Acest singur act de a crea o copie de rezervă și de a lucra cu versiunea de rezervă vă oferă libertatea de a efectua și de a practica orice fel de transformare de date, deoarece asigură că, chiar dacă eliminați datele clientului companiei, acesta poate fi recuperat. De fapt, nu numai noii angajați, ci și veteranii aceleiași companii IT nu efectuează nicio transformare a datelor fără a crea copii de rezervă. 

Deși copierea de rezervă a bazelor de date în SQL Server nu este o sarcină dificilă, ea
este cu siguranta consumatoare de timp, mai ales atunci cand trebuie sa faceti copii de siguranta in mai multe baze de date dintr-o data. Deci, următorul scenariu este foarte util pentru acest scop.

DECLARE @name VARCHAR (50) - numele bazei de date DECLARE @path VARCHAR (256) - calea pentru fișierele de backup DECLARE @fileName VARCHAR (256) - numele fișierului pentru backup DECLARE @fileDate VARCHAR (20) - specificați directorul de backup al bazei de date SET @path = 'E: \\ Sovit \ _BackupFolder \' exec master.dbo.xp_create_subdir @path - specificați formatul fișierului SELECT @fileDate = CONVERT (VARCHAR (20), GETDATE db_cursor CURSOR PENTRU SELECT nume din master.dbo.sysdatabases WHERE nume IN ('DB_1', 'DB_2', 'DB_3', 'DB_4', 'DB_5', 'DB_6') - numai aceste baze de date OPEN db_cursor FETCH NEXT FROM db_cursor INTO @ nume WHILE @@ FETCH_STATUS = 0 BEGIN SET @fileName = @path + @ nume + '_' + @fileDate + '.BAK' BACKUP DATABASE @ nume TO DISK = @fileName FETCH NEXT FROM db_cursor INTO @name END CLOSE db_cursor DEALLOCATE db_cursor

4. Reduceți durata înregistrărilor bazei de date multiple

Fiecare bază de date SQL Server are un jurnal de tranzacții care înregistrează toate tranzacțiile și modificările bazei de date efectuate de fiecare tranzacție. Jurnalul de tranzacții este o componentă critică a bazei de date și, dacă există un eșec al sistemului, este posibil ca jurnalul de tranzacții să fie necesar pentru a aduce baza de date înapoi la o stare consecventă. 

Deoarece numărul tranzacțiilor începe să crească, disponibilitatea spațiului începe să devină o preocupare majoră. Din fericire, SQL Server vă permite să recuperați spațiul în exces prin reducerea mărimii jurnalului de tranzacții.

În timp ce puteți să micșorați manual fișierele jurnal, unul câte unul folosind interfața de utilizare furnizată, cine are timpul să facă acest lucru manual? Următorul script poate fi folosit pentru a micșora rapid fișierele jurnal de baze de date multiple.

DECLARE @logName ca nvarchar (50) DECLARE @databaseID ca int DECLARE db_cursor CURSOR PENTRU SELECT TOP 10 nume, database_id - doar 10 dar puteți alege orice număr FROM sys.master_Files WHERE fizic nume ca '% .ldf' și fizic_name nu ca ' C: \% '- specificați căile bazei de date și numele nu în (' mastlog ') - orice jurnale de bază de date pe care doriți să le excludeți ORDER BY size DESC OPEN db_cursor FETCH NEXT FROM db_cursor INTO @logName, @databaseID WHILE @@ FETCH_STATUS = 0 BEGIN DECLARE @databaseName ca nvarchar (50) SET @databaseName = DB_NAME (@databaseID) DECLARE @tsql nvarchar (300) SET @ tsql = 'USE [' + @ databaseName + '] ALTER DATABASE [' + @ databaseName + '] setul de recuperare simplu DBCC SHRINKFILE ('+ @ logName +', 1) 'EXEC (@tsql) FETCH NEXT FROM db_cursor INTO @logName, @databaseID END CLOSE db_cursor DEALLOCATE db_cursor

5. Restricționați conexiunea la baza de date prin setarea modului pentru un singur utilizator

Modul pentru un singur utilizator specifică faptul că un singur utilizator poate accesa în același timp baza de date și este, în general, utilizat pentru acțiuni de întreținere. În principiu, dacă alți utilizatori sunt conectați la baza de date în momentul în care setați baza de date la un singur utilizator, conexiunile la baza de date vor fi închise fără avertisment. 

Acest lucru este foarte util în scenariile în care trebuie să restaurați baza de date la versiunea dintr-un anumit moment sau trebuie să preveniți posibilele modificări prin orice alte procese care accesează baza de date.

USE master; GO ALTER DATABASE YourDatabaseName SET SINGLE_USER CU ROLLBACK IMMEDIATE; GO ALTER DATABASE YourDatabaseName SET READ_ONLY; GO ALTER DATABASE YourDatabaseName SET MULTI_USER; MERGE

6. Funcția String în SQL pentru a genera texte dinamice

Multe limbi de programare vă permit să introduceți valori în interiorul textelor șir, ceea ce este foarte util atunci când generați texte din siruri dinamice. Deoarece SQL nu oferă o astfel de funcție în mod implicit, aici este o soluție rapidă pentru asta. Folosind funcția de mai jos, orice număr de texte poate fi inserat dinamic în interiorul textelor de coarde.

--Exemplu de utilizare - declare @test varchar (400) --select @test = [dbo]. [FN_SPRINTF] ('Sunt% s și ești% s', '1,0', ' separator ',' --print @test - rezultat: Sunt 1 si esti 0 --select @test = [dbo]. [FN_SPRINTF] ('Sunt% s si esti% s', '1 # 0 ',' # ') - param separator', '--print @test - rezultat: Sunt 1 si esti 0 SET ANSI_NULLS pe ​​GO SET QUOTED_IDENTIFIER ON GO - =========== ================================== - AUTOR:  -- ============================================ CREATE FUNCTION DBO.FN_SPRINTF (MAX), @PARAMS VARCHAR (MAX), @PARAM_SEPARATOR CHAR (1) = ',') RETURNS VARCHAR (MAX) ÎNCEPE DECLARE @P VARCHAR (MAX) DECLARE @PARAM_LEN INT SET @PARAMS = @ PARAMETRI + @PARAM_SEPARATOR SET @PARAM_LEN = LEN (@PARAMS) CÂND NU @PARAMS = "BEGIN SET @P = STÂNGA (@ PARAMS_SEPARATOR, CHARINDEX @ CHARINDEX ('% S', @STRING), 2, @ P) SET @PARAMS = SUBSTRING (@PARAMS, LEN (@P) +2, @PARAM_LEN) END RETURN @

7. Imprimarea definițiilor coloanelor de masă

Atunci când se compară mai multe baze de date care au scheme similare, trebuie să se uite la detaliile coloanelor de tabelă. Definițiile coloanelor (tipuri de date, nullabile?) Sunt la fel de importante ca și numele coloanelor. 

Acum, pentru bazele de date care au mai multe tabele și tabele care au mai multe coloane, poate dura destul timp pentru a compara fiecare coloană manual cu o coloană dintr-un alt tabel al unei alte baze de date. Următorul script poate fi utilizat cu precizie pentru a automatiza acest proces, deoarece imprimă definițiile tuturor tabelelor pentru o bază de date dată.

SELECT numele sh.name + '.' + O.name AS ObjectName, s.name ca ColumnName, CASE CÂND t.name IN ('char', 'varchar') THEN t.name + '(' CASE WHEN s.max_length<0 then 'MAX' ELSE CONVERT(varchar(10),s.max_length) END+')' WHEN t.name IN ('nvarchar','nchar') THEN t.name+'('+CASE WHEN s.max_length<0 then 'MAX' ELSE CONVERT(varchar(10),s.max_length/2) END+')' WHEN t.name IN ('numeric') THEN t.name+'('+CONVERT(varchar(10),s.precision)+','+CONVERT(varchar(10),s.scale)+')' ELSE t.name END AS DataType ,CASE WHEN s.is_nullable=1 THEN 'NULL' ELSE 'NOT NULL' END AS Nullable FROM sys.columns s INNER JOIN sys.types t ON s.system_type_id=t.user_type_id and t.is_user_defined=0 INNER JOIN sys.objects o ON s.object_id=o.object_id INNER JOIN sys.schemas sh on o.schema_id=sh.schema_id WHERE O.name IN (select table_name from information_schema.tables) ORDER BY sh.name+'.'+o.name,s.column_id

Concluzie

În acest articol, am analizat șapte scenarii utile care pot reduce numărul de lucrări manuale și laborioase și pot crește eficiența globală pentru dezvoltatorii SQL. De asemenea, am analizat diferite scenarii în care aceste scripturi pot fi implementate. 

Dacă sunteți în căutarea pentru mai multe script-uri SQL pentru a studia (sau de a folosi), nu ezitați să vedeți ce avem pe CodeCanyon.

Odată ce ați început să obțineți atârnă de aceste scripturi, cu siguranță veți începe să identifice multe alte scenarii în cazul în care aceste scripturi pot fi utilizate în mod eficient.

Mult noroc!

Cod