[PL] Skryptowanie w SQL Server 2008 – Proste typy danych użytkownika
Intro
Typy danych użytkownika tworzymy zazwyczaj z myślą, by ewentualne zmiany długości, precyzji czy skali przeprowadzać w sposób prostszy, bo scentralizowany. Niestety, Microsoft nie daje nam w SQL Server polecenia ALTER TYPE, ale i tak używamy własnych typów, a w razie potrzeby jakiejkolwiek zmiany przeprowadzamy operację opisaną tutaj: [EN] Call for voting – ALTER TYPE in SQL Server. W tej notce pokażę, jak można skryptować proste typy danych stworzone przez użytkowników w bazie danych. Nie będę opisywał skryptowania typów tabelarycznych i typów stworzonych w CLR.
Skryptowanie typów prostych
Zadanie: zeskryptować wszystkie proste typy danych użytkownika w bazie danych.
Dla każdego typu trzeba stworzyć kod sprawdzający, czy typ nie istnieje (trzeba zajrzeć do widoku sys.types) oraz wygenerować kod polecenia CREATE TYPE o składni jak poniżej (na podstawie Books Online):
CREATE TYPE [ schema_name. ] type_name FROM base_type [ ( precision [ , scale ] ) ] [ NULL | NOT NULL ];
Rozwiązanie:
USE AdventureWorks2008R2;
SET NOCOUNT ON;
SELECT
'IF NOT EXISTS (
SELECT * FROM sys.types
WHERE [schema_id] = SCHEMA_ID(' +
QUOTENAME(SCHEMA_NAME([schema_id]), '''') + ') AND name = N' +
QUOTENAME(name, '''') + '
)
CREATE TYPE ' + QUOTENAME(SCHEMA_NAME([schema_id])) + '.' + QUOTENAME(name) + '
FROM ' + TYPE_NAME(system_type_id) +
CASE
WHEN system_type_id IN (
165, --varbinary
167, --varchar
173, --binary
175, --char
231, --nvarchar
239 --nchar
)
THEN '(' +
CONVERT(
varchar(4),
CASE
WHEN max_length = -1
THEN 'max'
ELSE max_length
END
) + ')'
WHEN system_type_id IN (
41, --time
42, --datetime2
43 --datetimeoffset
)
THEN '(' + CONVERT(char(1), scale) + ')'
WHEN system_type_id IN (
106, --decimal
108 --numeric
)
THEN '(' +
CONVERT(varchar(2), precision) + ',' +
CONVERT(varchar(2), scale) + ')'
WHEN system_type_id = 62 --float
THEN '(' + CONVERT(varchar(2), precision) + ')'
ELSE ''
END + ' ' +
CASE
WHEN is_nullable = 0
THEN 'NOT NULL'
ELSE 'NULL'
END + ';
GO'
FROM sys.types
WHERE is_user_defined = 1 --typ użytkownika
AND is_table_type = 0 --nie typ tabelaryczny
AND is_assembly_type = 0; --nie typ CLR
GO
Fragment wyniku:
Uwagi: w Management Studio ustaw Results to Text, sugeruję też zwiększenie maksymalnej długości tekstu w jednej kolumnie zwracanej w wynikach zapytań (w menu głównym kliknij Tools – Options – Query Results – SQL Server – Results to Text i w polu Maximum number of characters displayed in each column wpisz 8192, a następnie uruchom ponownie Management Studio).
Komentarz do kodu:
- metadane typów zwraca widok sys.types (ale metadane typów tabelarycznych są też w sys.table_types),
- typy też mają dwuczłonowe nazwy (znajdują się w schematach) – stąd użycie funkcji SCHEMA_NAME,
- funkcja QUOTENAME jak zwykle służy mi do otaczania identyfikatorów nawiasami kwadratowymi i apostrofami,
- do uzyskania nazwy typu systemowego użytego na potrzeby danego typu użytkownika wykorzystałem funkcję TYPE_NAME wywołaną na identyfikatorze typu systemowego trzymanym w kolumnie system_type_id w widoku sys.types,
- przy niektórych typach systemowych niezbędne jest podanie maksymalnej długości (typy binarne i tekstowe), dokładności (data i czas), precyzji (float) albo precyzji i skali (decimal/numeric),
- dzięki kolumnie is_nullable z widoku sys.types mogłem określić, czy typ pozwala domyślnie na przechowywanie wartości NULL, czy nie,
- w klauzuli WHERE odfiltrowałem typy systemowe, typy tabelaryczne i typy CLR.
Słowo podsumowania
Skryptowanie typów prostych jest stosunkowo łatwe. W zasadzie wszystkie niezbędne metadane są do odczytania z jednego widoku systemowego (sys.types). A przy okazji można się choćby oswoić z niekoniecznie oczywistym faktem – typy też są trzymane w schematach. Skryptowanie pozostałych typów użytkownika (tabelarycznych i CLR) jest już nieco trudniejsze. Ale to temat na być może kolejny wpis na moim blogu :-)
[EDYCJA] Dziękuję Krzysiowi Stachyrze, który wypatrzył w tym wpisie czeski błąd – oczywiście SQL Server nie daje polecenia ALTER TYPE. ALTER TABLE na szczęście mamy :-) [/EDYCJA][PL] Skryptowanie w SQL Server 2008 – Proste typy danych użytkownika5.051
No trackbacks yet.
Wirtualna premiera SQL Server 2012
2012/01/23 - 22:21
Tags: Denali, SQL Server
Posted in Denali, SQL Server | 3 comments
Właśnie dowiedziałem się, będąc w Redmond na szkoleniu Bare Metal SQL Server 2012, że 7 marca będzie miała miejsce wirtualna premiera SQL Server 2012! Jeżeli interesuje Cię nowa wersja SQL Servera, chcesz obejrzeć 30+ sesji prowadzonych przez czołowych specjalistów z całego świata i pracowników Microsoft, nie przegap tego wydarzenia i rejestruj się już dzisiaj na [...]
Materiały z dwóch edycji SQLDay Workshop
2012/01/07 - 08:49
Tags: SQL Server, SQLDay
Posted in SQL Server | No comments
Ostatnio informowałem o trzeciej edycji warsztatów SQLDay Workshop. Miejsca na warsztaty rozeszły się błyskawicznie, co tylko potwierdza, jak potrzebne są podobne przedsięwzięcia.
Miło mi poinformować za Tobiaszem Koprowskim, aktualnym prezesem Polskiej Grupy Użytkowników SQL Server (PLSSUG), że na kanale YouTube PLSSUG dostępne są nagrania wideo z dwóch poprzednich edycji warsztatów.
Osoby zainteresowane materiałami zapraszam na podane poniżej [...]
Wydarzenie – warsztaty SQLDay Workshop 2012
2011/12/27 - 21:34
Tags: SQL Server, SQLDay, warsztaty
Posted in Communities | 8 comments
W imieniu krakowskiego oddziału Polskiej Grupy Użytkowników SQL Server (PLSSUG) zapraszam na doroczne warsztaty SQLDay Workshop 2012. Warsztaty odbędą się, tradycyjnie już, w Krakowie. Termin imprezy: 4 lutego 2012. Miejsce: Krakowski Park Technologiczny Sp. z o.o., Al. Jana Pawła II 41L. Warsztaty będą bezpłatne, ale wymagana będzie rejestracja (wkrótce na stronie warsztatów). Wszelkich informacji na [...]
[PL] Nowe obiekty systemowe w SQL Server 2012 RC0
2011/12/12 - 21:11
Tags: Denali, metadane, obiekty, SQL Server
Posted in Denali, SQL Server | No comments
Całkiem niedawno Aaron Bertrand (SQL Server MVP) opublikował na swoim blogu listę nowych obiektów systemowych, które pojawiły się w SQL Server 2012 RC0, a nie było ich w SQL Server 2012 CTP3. Pomyślałem, że przydałaby się analogiczna lista, ale w odniesieniu do obiektów z SQL Server 2008 R2.
Jak taką listę przyrządzić? W moim przypadku było [...]
[PL] Konferencje, prelekcje, wydarzenia
2011/11/24 - 20:36
Tags: konferencja, PLSSUG, SQL Server, WWSI
Posted in Communities, SQL Server | No comments
Szykuje się sporo atrakcji dla osób zainteresowanych bazami danych, w szczególności tymi implementowanymi w systemie Microsoft SQL Server. Pomyślałem, że dobrze by było zebrać informacje o nadchodzących wydarzeniach i wyostrzyć czujność pasjonatów baz danych.
Już za tydzień, w czwartek 1 grudnia, o godzinie 18:00 w siedzibie firmy Microsoft w Warszawie przy Al. Jerozolimskich 195A rozpocznie się [...]
[PL] Najlepsze praktyki dla programisty T-SQL – collation i "obce znaczki"
2011/11/06 - 22:26
Tags: konferencja, MTS, SQL Server, T-SQL
Posted in SQL Server | No comments
Na tegorocznej konferencji Microsoft Technology Summit (MTS) przedstawiłem wraz z Markiem Adamczukiem prezentację pt. "Najlepsze praktyki dla programisty Transact-SQL". Po tej sesji sporo osób prosiło mnie o materiały, a głównie demonstracje. Dobra informacja jest taka, że materiały te można już pobrać ze strony konferencji. Najwięcej dyskusji po prezentacji dotyczyło fragmentu poświęconego collation i pracy z [...]
[PL] SQL Server MVP Deep Dives vol. 2 już jest!
2011/09/27 - 20:35
Tags: książka, MVP, SQL Server
Posted in Communities, SQL Server | 2 comments
Miło mi poinformować, że wydawnictwo Manning rozpoczęło przyjmowanie zamówień na książkę SQL Server MVP Deep Dives vo. 2, której jestem współautorem. Oficjalna premiera książki będzie miała miejsce w Redmond w czasie konferencji PASS Summit 2011. Dla osób, które nie zetknęły się z pierwszą częścią książki – SQL Server MVP Deep Dives to książka pisana przez [...]
[PL] Będę na MTS 2011
2011/08/16 - 21:28
Tags: konferencja, MTS, SQL Server
Posted in Communities | 5 comments
Miło mi zakomunikować, że w tym roku pojawię się w roli prelegenta na konferencji Microsoft Technology Summit 2011 (MTS 2011). Wraz z moim przyjacielem, Markiem Adamczukiem, zostaliśmy zaproszeni przez firmę Microsoft do udziału w konferencji i przygotowanie wspólnej prezentacji. Co ciekawe, w dobie nadchodzącej następnej wersji SQL Servera – Denali – poproszono nas o sesję [...]
[PL] Denali CTP3 – Nowe lepsze DBCC IND?
2011/07/26 - 07:46
Tags: Denali, DMV, SQL Server
Posted in SQL Server | 5 comments
Niedawno ukazała się nowa publiczna wersja Community Preview 3 (CTP3) systemu SQL Server vNext (codename Denali). Przejrzenie listy DMVs w tej wersji zaowocowało znalezieniem kilku ciekawych obiektów, ale najciekawszym z mojego punktu widzenia wydaje się być sys.dm_db_database_page_allocations.
[PL] Zmiany w PLSSUG
2011/06/20 - 13:40
Tags: PLSSUG, SQL Server
Posted in Communities | 5 comments
W ostatnią sobotę, 18 czerwca, odbyła się we Wrocławiu trzecia już w historii konferencja SQLDay. Organizatorem, jak zwykle, była Polska Grupa Użytkowników SQL Server (PLSSUG). Niestety, sprawy zawodowe tym razem nie pozwoliły mi wziąć udziału w konferencji, nad czym boleję. Tak czy owak, tradycji musiało stać się za dość i w trakcie konferencji został ogłoszony [...]

Nazywam się Paweł Potasiński i pracuję w polskim oddziale Microsoft w dziale Small and Midmarket Solutions & Partners (SMS&P) jako Partner Technology Advisor.





2010/08/16 - 20:46
Chyba Pawle chodziło o brak polecenia ALTER TYPE bo przecież ALTER TABLE mamy w SQL Server ;)))
oczywiście nie to żebym się czepiał ;)
2010/08/17 - 06:35
Krzysiu, oczywiście, że masz rację! Dzięki za uważne czytanie. Czeski błąd, ale ktoś mógłby pomyśleć, że za mocno się rozpędziłem w narzekaniu na MS ;-) Jeszcze raz dzięki. Credits dla Ciebie na końcu posta.