Skrypty oznaczone posty

Różnice pomiędzy Delete i Truncate w T-sql

Przeglądając kod T-SQL można wywnioskować, że osoby mniej doświadczone używają zamiennie dwóch poleceń służących do usuwania wierszy: Delete i Trucate.
Jaka jest między nimi różnica?

Zarówno polecenie Delete jak i Truncate służy do usuwania wierszy z tabeli lecz występują znaczące różnice pomiędzy nimi:

  • Delete – można użyć klauzuli WHERE w celu wybrania wierszy do usunięcia.
    Truncate
    – usuwa wszystkie wiersze z tabeli.
  • Truncate działa szybciej niż Delete.
  • Delete uruchamia triggery,  Truncate nie.
  • Delete dla każdego usuniętego wiersza dokonuje wpisu w dzienniku transakcji.         
  • Truncate usuwa dane poprzez dealokację stron przechowujących dane w tabeli i rejestruje tylko te strony w dzienniku transakcji.
  • Delete jest poleceniem DML, a Truncate jest poleceniem DDL
  • Truncate resetuje właściwość Identity do wartości początkowych.

 

Więcej informacji na MSDN:

Czytaj dalej

Sprawdzenie poprawność składni T-SQL bez uruchamiania kodu

Często może zajść sytuacja, że chcemy sprawdzić poprawność napisanego kodu w T-SQL-u, ale z pewnych przyczyn nie możemy czy też nie chcemy uruchomiać kodu. Z pomocą przychodzi nam SET PARSEONLY.

Składnia:

SET PARSEONLY {ON | OFF}

Zadaniem PARSEONLY ON jest sprawdzenie składni każdej instrukcji Transact-SQL i zwrócenie komunikatu o błędach bez kompilacji lub wykonywania instrukcji.

PARSEONLY OFF wyłącza tryb sprawdzania. MS SQL Server wtedy kompiluje i wykonuje instrukcję.

 set parseonly on
 select 3/0 -- ten fragment przejdzie bez błędu.
 -- składnia jest prawidłowa
 go
 set parseonly off
 select 3/0 -- ten fragment wygeneruje błąd wykonania
 go
 

Uwagi:

  • Zazwyczaj ustawia się  PARSEONLY ON w czasie analizy kodu.
  • Nie należy używać PARSEONLY w procedurach składowanych lub wyzwalaczach.

Dodatkowe informacje na Technet:  http://technet.microsoft.com/en-us/library/ms178629.aspx

Czytaj dalej

Zwiększony minimalny rozmiar modelu w MS SQL Server 2012

Jeżeli posiadamy skrypty poprawnie działające w wersji MS SQL Server 2008 R2, w których należy określić początkowy minimalny rozmiar bazy danych,
należy podczas migracji do wersji MS SQL Server 2012 uwzględnić zmiany jakie zaszły w modelu bazy danych.

Z powodu dodania nowych tabel, widoków, procedur i innych obiektów zwiększył się minimalny rozmiar bazy z 2 MB na 5 MB. Uzycie dotychczasowych skryptów określających minimum na 2 MB spowoduje wywołanie błędu nr 1803:

CREATE DATABASE [test_db] ON PRIMARY
( NAME = N'test_db',
  FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL11\MSSQL\DATA\test_db.mdf' ,
  SIZE = 2048KB , -- powinno być 5120KB
  FILEGROWTH = 1024KB )
LOG ON
( NAME = N'test_db_log',
  FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL11\MSSQL\DATA\test_db_log.ldf' ,
  SIZE = 1024KB ,
  FILEGROWTH = 10%)
GO

W odpowiedzi dostaniemy błąd:

Msg 1803, Level 16, State 1, Line 3 The CREATE DATABASE statement failed.
The primary file must be at least 5 MB to accommodate a copy of the model database.

Poniżej przedstawiam historię zmnian rozmiaru model.mdf i modellog.ldf.

SQL Server version

Physical file size...

Czytaj dalej

Zautomatyzowane uruchamianie SSMS

SSMS (SQL Server Management Studio) jest jednym z najbardziej rozpowszechnionych narzędzi do zarządzania MS SQL Serverem.

Wywodzi się on z projektu Yukon (SQL Server Workench).

UWAGA:

Dla wersji MS SQL Server 2005 należy uruchamiać jako sqlwb.exe
Dla wersji MS SQL Server 2008 i 2008R2 należy uruchamiać jako ssms.exe

Dalej opisywany będzie jako ssms.

Bardzo często zdarza się, że wielokrotnie uruchamiamy SSMS, otwieramy te same skrypty dotyczące tych samych serwerów i baz. Cały ten proces można zautomatyzować poprzez podawanie odpowiednich argumentów w linii komend podczas uruchamiania SSMS i tworzenie odpowiednich skrótów.

Składnia:

 Ssms.exe
 [scriptfile] [projectfile] [solutionfile]
 [-S servername[\instance name]] 
 [-d databasename]
 [-U username] [-P password] 
 [-E] 
 [-nosplash] 
 [-?]

Opis argumentów:

[scriptfile] – otwarcie jednego lub kilku skryptów (.sql). Należy podać pełną ścieżkę dostępu do plików.

np.  ssms "C:\SQL\Test1.sql" 
       ssms "C:\SQL\Test1.sql" "C:\SQL\Test2.sql"

UWAGA: Skrypty te są otwierane, ale nie są uruchamiane!

[projectfile] – otwarcie projektu SQL Server Management Studio(.ssmssqlproj)...

Czytaj dalej

Zamiana sid-a usera sidem z loginu w SQL Server 2000.

Bardzo często zdarza się, że przenosimy bazę danych na inną instancję serwera czy też na inny fizyczny serwer.

Mamy już założone loginy lub te loginy zakładamy. Po przeniesieniu bazy i po jej odtworzeniu posiadamy te same nazwy userów ale z innymi wartościami sid tzn. inny jest sid zapisany w tabeli sysusers należącej do przenoszonej bazy danych oraz inny jest sid zapisany w tabeli sysxlogins bazy systemowej master.

Należy podmienić sidy w tabeli wybranej bazy danych sysusers sidami z tabeli sysxlogins bazy master w ramach tej samej nazwy loginu i usera.

Poniżej przedstawiony kod działa wyłącznie na wersji MS SQL Server 2000.

Use master
GO

sp_configure @configname = 'allow updates'
, @configvalue = '1';
RECONFIGURE WITH OVERRIDE
GO

UPDATE su
SET su.sid = sl.sid
FROM [nazwabazydanych]..sysusers AS su
JOIN master..sysxlogins AS sl ON su.[name] like sl.[name]
WHERE su.[name] = 'nazwausera'
GO

sp_configure @configname = 'allow updates'
, @configvalue = '0'

RECONFIGURE WITH OVERRIDE
GO
Czytaj dalej

Porównanie nazwy tabel i ilości rekordów bazy na dwóch instancjach MS SQL Servera.

Przedstawiam rozwinięcie skryptu „Informacje o tabelach, ilościach wierszy i wielkościach danych zawartych w bazie danych.” przydatnego przy porównywaniu nazw tabel i ilości rekordów w bazach danych umieszczonych na różnych serwerach. Niżej przedstawiony skrypt uruchamiamy na serwerze źródłowym, wynikiem którego jest wygenerowany automatycznie skrypt służący do uruchomienia na serwerze docelowym.

Wynikiem tego skryptu będzie tabela przedstawiająca różnice w występowaniu tabel czy też różnej ilości rekordów w bazie danych.

Testowany na SQL Server 2000, 2008.

/* Author Dariusz 'DBSoft' Brejnak (c) 2010
name        rows Database
publishers1    8 Source -- inna nazwa tabeli lub brak w destination
titles        28 Source   -- inna ilość rekordów
publishers     8 Destination -- inna nazwa tabeli lub brak w source
sales         21 Destination -- brak tabeli w source
titles        18 Destination -- inna ilość rekordów
*/

SET NOCOUNT ON
CREATE TABLE #tmp
([name] varchar(50),
[rows] int,
[reserved] varchar (20),
[data] varchar (20),
[index_size] varchar(20),
[unsed] varchar(20)
)
CREATE TABLE #tmprows_source
([servername] varchar(50),
[basenam...
Czytaj dalej
DBBS