Archive for May, 2009

Změna portu se provádí přes SQL Server configuration manager. V menu v položce Protocols for MSSQLSERVER se zvolí vlastnosti TCP/IP. A dále podle potřeby pro dané IP adresy navázané na server se upraví TCP Port. Stačí 127.0.0.1, vnitřní IP a vnější IP. Pro každou se dá nastavit jiný port, popř. vytvořit alias.

V Management studiu se potom port nedefinuje přes dvojtečku, ale přes IP,port. Např. 192.168.2.2,12345. Pokud se přistupuje k instanci nebo aliasu, tak potom např. přes 192.168.2.2\alias,12345.

Pro connection string poté platí zápis tcp:<servername>[\<instancename>],<port> nebo tcp:<IPAddress>[\<instancename>],<port> viz dokumentace

Share
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
--Název aplikace z níž je vykonáván aktuální sql dotaz:
select APP_NAME()
--Microsoft SQL Server Management Studio - Query
 
--Vrací kódovou stránku hodnoty collation
select Collationproperty('Czech_CI_AI','codepage')
--1250
 
--Funkce parsename vrací objekt z cesty oddělený tečkou:
--Získává data z cesty: server.databáze.schema.tabulka
select parsename('dbo.books',1)
--books
select parsename('dbo.books',2)
--dbo
 
--Vrací název aktuálně přihlášeného DB uživatele
select Current_User
select USER_NAME()
 
--Vrací název loginu
select SUSER_NAME()
 
--Vrací rozdílné délky řetězců. Len() vrací bez whitespaces:
select LEN('text    ')
--4
select dataLENgth('text    ')
--8
 
--vrací seznam podporovaných collation
select * from fn_Helpcollations()
 
--Číslo klientského PID procesu, který posílá požadavek na SQL server
select Host_Id()
--1912
 
--Jméno klientské stanice vysílající požadavek na SQL Server
select Host_Name()
--HONZA
 
--Vrací nastavení serverových vlastností
select Serverproperty('IsSingleUser')
--0
 
--Vrací nastavení vlastností aktuální relace
select Sessionproperty('ARITHABORT')
--1
 
--Vrací kdy byly naposledy aktualizovány statistiky pro index
--První parametr je číslo tabulky, druhý je číslo indexu
SELECT name AS index_name,
STATS_DATE(object_id, index_id) AS statistics_update_date
FROM sys.indexes
WHERE object_id = OBJECT_ID('books');
 
--Zjistí vlastnosti o daném objektu. jestli je tabulka, pohled, cizí klíč apod.
select Objectproperty(OBJECT_ID('books'),'istable')
--1
 
--Varcí údaje o datovém typu:
SELECT TYPEPROPERTY( 'int', 'PRECISION');
--10 - je v tomto případě maximální délka vkládaného čísla
 
--Funkce checksum vrací hash dané hodnoty. je lepší použít hashBytes + MD5. U checksum může docházet k větším kolizím.
--Funkce checksum má zajímavost - v případě order by CHECKSUM(*) jsou výsledky seřazeny podle toho, jak jdou sloupce v definici tabulky za sebou.
select * from books
order by CHECKSUM(*)
 
--Funkce columns_updated a update() se používají v after trigerech ke zjištění zda byl záznam vložen/změněn
Share

Včera byl uvolněn na stažení SQL Server 2008 Developer Training Kit. Ten předvádí jaké jsou možnosti využití SQL Serveru 2008 + i v kombinaci s MS Visual Web Developer Tools 2008.

Adresa pro stažení je:

http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=e9c68e1b-1e0e-4299-b498-6ab3ca72a6d7

Share

SQL Server 2005 a 2008 umožňují prostřednictvím klauzule OUTPUT u příkazů INSERT, UPDATE a DELETE vrátit jaké záznamy byly vloženy nebo smazány.  Příklad:

1
2
3
INSERT INTO author(surname)
      OUTPUT inserted.id_author
      VALUES('myAuthor')

nebo

1
2
3
4
5
6
declare table @myTempTable(
    tempValue int not null
)
INSERT INTO author(surname)
      OUTPUT inserted.id_author into @myTempTable(tempValue)
      VALUES('myAuthor')

V prvním případě se vrátí hodnota id_author, která vznikne po vložení záznamu do tabulky(např. prostřednictvím DEFAULTu). Tato hodnota se vrátí jako resultset.
V druhém případě se provede jen INSERT s tím, že vložená data se vrátí do dočasné tabulky, kterou je ovšem potřeba ještě předtím nadefinovat.

Pomocí tohoto postupu lze vrátit hodnota DEFAULT na kterou je navázána funkce newsequentialid(). Tato funkce vrací binárně seřazená data narozdíl od newid(), je tedy vhodnější pro sloupce na kterých má být clusterovaný index. Nevýhodou uniqueidentifieru je to, že narozdíl od IDENTITY se k nově vytvořené hodnotě nedá přistoupit přes funkci scope_identity() popř. @@identity. Takže i z tohoto důvodu byla přidána možnost OUTPUT klauzule.

OUTPUT se liší tím, že ovlivňované hodnoty se vypisují až za ni. Viz VALUES v horním příkladech. Za OUTPUT následuje inserted.* nebo inserted.sloupec a nebo deleted.* nebo deleted.sloupec

Tak a teď co je Composable DML?

Je to novinka v SQL Serveru 2008.

Spočívá v tom, že vytvořením resultsetu přes klauzuli OUTPUT je možné s těmito daty dále pracovat jako s derivovanou tabulkou pro kterou se definuje název výstupních sloupců.

Příklad:

1
2
3
4
5
INSERT INTO books(id_author, pages)  --vnější insert do tabulky knihy
SELECT id_author, 200 AS pages
FROM (INSERT INTO author(surname) --vnitřní insert do tabulky autoři
      OUTPUT inserted.id_author
      VALUES('myAuthor')) AS T(id_author);

je to daleko krásnější řešení jako:

1
2
3
4
5
6
7
8
9
10
11
declare @myTempVariable table(
	tempValue uniqueidentifier not null
)
 
insert into author(surname)
	output inserted.id_author into @myTempVariable(tempValue)
	values('myAuthor')
 
insert into books(id_author, pages)
select tempValue, 120
	from @myTempVariable

Více je v tomto článku http://www.sqlmag.com/Article/ArticleID/99242/sql_server_99242.html

Omezení composable DML: Nelze ovlivňovat hodnoty, které jsou vkládány jako cizí klíč! V tomto případě tedy v tabulce books nesmí být id_author cizím klíčem.

O composable DML mi napsal pan Plamen Ratchev v rámci odpovědi na dotaz v diskusi Microsoft.public.sqlserver.programming. Velmi mu děkuji za cenné informace.

Share