Rejestrowanie Typy definiowane przez użytkownika w programie SQL Server
In order to use a user-defined type (UDT) in Microsoft SQL Server, you must register it.Rejestrowanie UDT polega na rejestrowanie wirtualny plik dziennika i tworzenia typu w bazie danych, w którym chcesz go używać.UDTs obejmuje zasięgiem jednej bazy danych i nie mogą być używane w wielu baz danych, chyba że identyczne wirtualny plik dziennika i UDT są zarejestrowane z każdej bazy danych.Gdy wirtualny plik dziennika UDT jest zarejestrowany, a typ tworzony, można użyć UDT w Transact-SQL w kodzie klient. Aby uzyskać więcej informacji zobaczŚrodowisko CLR Typy definiowane przez użytkownika.
Przy użyciu programu Visual Studio do wdrożyć UDTs
Najprostszym sposobem wdrożyć sieci UDT jest przy użyciu Microsoft Program Visual Studio. W przypadku bardziej złożonych scenariuszach rozmieszczania i największą elastyczność jednak używać Transact-SQL zgodnie z opisem w dalszej części tego tematu.
Wykonaj następujące kroki, aby utworzyć i wdrożyć UDT, przy użyciu programu Visual Studio:
Tworzenie nowej Bazy danych projektuProgram Visual Basic or Program Visual C# język węzłów.
Dodaj odwołanie do SQL Server Baza danych, który będzie zawierał UDT.
Dodawanie Typ zdefiniowany przez użytkownika klasy.
Pisanie kodu do wykonania UDT.
Z Kompilacja Wybierz opcję menuwdrożyć.To rejestruje wirtualny plik dziennika i typu w tworzy SQL Server Baza danych.
Rozmieszczanie UDTs przy użyciu języka Transact-SQL
The Transact-SQL CREATE wirtualny plik dziennika syntax is used to register the wirtualny plik dziennika in the database in which you wish to use the UDT. To jest przechowywany wewnętrznie w tabelach systemowych baz danych, nie zewnętrznie w systemie plików.Jeśli UDT jest zależna od zewnętrznych zespołów, zbyt muszą one być ładowane do bazy danych.Instrukcja CREATE typ jest używany do tworzenia UDT w bazie danych, w którym ma być używany.Aby uzyskać więcej informacji zobacz CREATE MONTAŻOWYCH (języka Transact-SQL) i CREATE TYPE (Transact-SQL).
Za pomocą CREATE wirtualny plik dziennika
Składnia CREATE MONTAŻOWYCH rejestruje wirtualny plik dziennika w bazie danych, w której chcesz użyć UDT.Gdy wirtualny plik dziennika jest zarejestrowany, to nie ma zależności.
Tworzenie wielu wersji tego samego wirtualny plik dziennika w danej bazie danych nie jest dozwolone.However, it is possible to create multiple versions of the same assembly based on culture in a given database.SQL Server distinguishes multiple culture versions of an assembly by different names as registered in the instance of SQL Server.Aby uzyskać więcej informacji zobacz „ Tworzenie i korzystanie z Strong-Named zestawy"w zestawie .NET Framework SDK.
Kiedy CREATE MONTAŻOWYCH jest wykonywane z uprawnieniem bezpieczne lub EXTERNAL_ACCESS Ustawia, wirtualny plik dziennika jest sprawdzany upewnij się, że jest mogą zostać sprawdzone, a następnie wpisz bezpieczne.Jeżeli pominięto parametr określający zestaw uprawnień, przyjmowana jest bezpieczne.Zestaw uprawnień NIEBEZPIECZNY kod nie jest zaznaczone.Aby uzyskać więcej informacji na temat wirtualny plik dziennika zestawy uprawnień Zobacz Projektowanie zestawy.
Przykład
Poniżej Transact-SQL Instrukcja rejestruje zestawowi punktów w SQL Server w AdventureWorks bazy danych, z uprawnieniami AWARYJNYM należy ustawić.W przypadku pominięcia klauzula WITH PERMISSION_SET wirtualny plik dziennika jest zarejestrowany wirtualny plik dziennika uprawnień awaryjny.
USE AdventureWorks;
CREATE ASSEMBLY Point
FROM '\\ShareName\Projects\Point\bin\Point.dll'
WITH PERMISSION_SET = SAFE;
Poniżej Transact-SQL Instrukcja rejestruje wirtualny plik dziennika, przy użyciu <specyfikatorze> argument w klauzula FROM. To varbinary wartość reprezentuje plik jako strumień bajtów.
USE AdventureWorks;
CREATE ASSEMBLY Point
FROM 0xfeac4 … 21ac78
Przy użyciu typu CREATE
Gdy wirtualny plik dziennika jest załadowany do bazy danych, można utworzyć przy użyciu typu Transact-SQL Instrukcja CREATE TYPE. Typ spowoduje to dodanie do listy dostępnych typów danej bazy danych.Typ ma zakres bazy danych i typu można używać tylko w bazie danych, w której został utworzony.Jeśli UDT już istnieje w bazie danych, w instrukcja CREATE typu kończy się niepowodzeniem z powodu błędu.
Uwaga
Składnia typu CREATE służy do tworzenia macierzystego SQL Server alias danych typów i jest przeznaczony do zastąpienia sp_addtype jako środek alias tworzenia typów danych. Niektóre z argumentów opcjonalnych w składni CREATE typ odnoszą się do tworzenia UDTs i nie są stosowane do tworzenia typów danych alias (takie jak typ podstawowy).
Uwaga
Zaczyna się od SQL Server 2005, na SQL ServerBaza danych o poziom zgodności „ 80"nie można tworzyć zarządzane typów zdefiniowanych przez użytkownika, procedura przechowywana, funkcje, zagregowanych lub wyzwalaczy. Aby korzystać z tych CLR funkcje integracja SQL Server, należy użyć sp_dbcmptlevel (języka Transact-SQL)procedura przechowywana, aby ustawić poziom zgodności bazy danych "100".
Aby uzyskać więcej informacji zobaczCREATE TYPE (Transact-SQL).
Przykład
Poniżej Transact-SQL Instrukcja tworzy Point Typ. EXTERNAL nazwa jest określona przy użyciu składni nazw dwóch części z AssemblyName.UDTName.
CREATE TYPE dbo.Point
EXTERNAL NAME Point.[Point];
Usuwanie UDT z bazy danych
Instrukcja DROP TYPE usuwa UDT z bieżącej bazy danych.Po upuszczeniu UDT można użyć instrukcja DROP MONTAŻOWYCH, mają być umieszczane wirtualny plik dziennika z bazy danych.
Instrukcja DROP TYPE nie wykonuje się w następujących sytuacjach:
Tabele w bazie danych, które zawierają kolumny zdefiniowane przy użyciu UDT.
Procedur przechowywanych, funkcji lub wyzwalaczy, które używają zmiennych lub parametrów UDT, utworzone w bazie danych z klauzula WITH SCHEMABINDING.
Przykład
Poniżej Transact-SQL należy wykonać w podanej kolejności. Pierwsza tabela, do której odwołuje się Point UDT musi być odrzucone, następnie typu, a na końcu wirtualny plik dziennika.
DROP TABLE dbo.Points;
DROP TYPE dbo.Point;
DROP ASSEMBLY Point;
Znajdowanie UDT zależności
Jeśli istnieją obiekty zależne, takie jak tabele z definicji kolumn UDT, instrukcja DROP TYPE nie powiedzie się.Nie jest on również w przypadku procedur przechowywanych, funkcji lub utworzone w bazie danych przy użyciu klauzula WITH SCHEMABINDING użycia tych procedur, zmiennych i parametrów typ zdefiniowany przez użytkownika.Najpierw usunąć wszystkie obiekty zależne, a następnie wykonać instrukcja DROP TYPE.
Poniżej Transact-SQL kwerendy Lokalizuje wszystkie kolumny i parametry, które używają UDT w AdventureWorks bazy danych.
USE Adventureworks;
SELECT o.name AS major_name, o.type_desc AS major_type_desc
, c.name AS minor_name, c.type_desc AS minor_type_desc
, at.assembly_class
FROM (
SELECT object_id, name, user_type_id, 'SQL_COLUMN' AS type_desc
FROM sys.columns
UNION ALL
SELECT object_id, name, user_type_id, 'SQL_PROCEDURE_PARAMETER'
FROM sys.parameters
) AS c
JOIN sys.objects AS o
ON o.object_id = c.object_id
JOIN sys.assembly_types AS at
ON at.user_type_id = c.user_type_id;
Utrzymywanie UDTs
Nie można modyfikować UDT utworzone w SQL Server Baza danych, chociaż można zmienić wirtualny plik dziennika na których oparta jest typu. W większości przypadków należy usunąć z bazy danych z UDT Transact-SQL Instrukcja DROP TYPE, wprowadzić zmiany do podstawowego wirtualny plik dziennika i ponownie załadować go za pomocą instrukcji ALTER wirtualny plik dziennika. Następnie należy ponownie utworzyć UDT i wszystkie obiekty zależne.
Przykład
ALTER wirtualny plik dziennika instrukcji jest używany po wprowadzeniu zmian do kodu źródłowego w sieci UDT wirtualny plik dziennika i ponownie kompilowana go.Kopiuje plik .dll na serwerze i rebinds do nowego wirtualny plik dziennika.Aby zapoznać się ze składnią pełną zobacz ALTER ASSEMBLY (Transact-SQL).
Poniżej Transact-SQL Instrukcja ALTER MONTAŻOWYCH ponownie ładuje wirtualny plik dziennika Point.dll z określonej lokalizacji na dysku.
ALTER ASSEMBLY Point
FROM '\\Projects\Point\bin\Point.dll'
Za pomocą ALTER wirtualny plik dziennika dodać kod źródłowy
W składni instrukcji ALTER MONTAŻOWYCH klauzula ADD FILE jest nieobecny w CREATE wirtualny plik dziennika.Służy do dodawania urządzenie źródłowe kod lub innych plików skojarzonych z wirtualny plik dziennika.Pliki są kopiowane z ich oryginalnej lokalizacji i przechowywane w tabelach systemowych w bazie danych.Daje to pewność, że masz urządzenie źródłowe kod i inne pliki z strony powinny kiedykolwiek należy ponownie utworzyć lub dokumentu bieżącą wersja UDT.
Poniżej Transact-SQL ALTER wirtualny plik dziennika instrukcji dodaje Point.cs klasy kod źródłowy Punkt UDT.Kopiuje tekst znajdujący się w pliku Point.cs i jest on przechowywany w bazie danych pod nazwą "PointSource".
ALTER ASSEMBLY Point
ADD FILE FROM '\\Projects\Point\Point.cs' AS PointSource;
Montaż informacje są przechowywane w sys.assembly_files tabela w bazie danych wirtualny plik dziennika został zainstalowany.The sys.assembly_files tabela contains the following columns.
assembly_id
Identyfikator zdefiniowany dla wirtualny plik dziennika.Ten numer jest przypisany do wszystkich obiektów odnoszących się do tego samego wirtualny plik dziennika.Nazwa
Nazwa obiektu.file_id
Liczba identyfikująca każdy obiekt z pierwszym obiektem skojarzonym z danej assembly_id jest podana wartość 1.Jeśli istnieje wiele obiektów skojarzonych z tym samym assembly_id, a następnie każdego kolejnego file_id wartość jest zwiększana o 1.zawartość
Reprezentacja szesnastkową wirtualny plik dziennika lub pliku.
Funkcja CAST lub CONVERT służy do konwertowania zawartości zawartość kolumna na tekst czytelny.Następująca kwerenda Konwertuje zawartość pliku Point.cs czytelnego tekstu przy użyciu nazwy w klauzula WHERE, aby ograniczyć wyniki ustawiona na jeden wiersz.
SELECT CAST(content AS varchar(8000))
FROM sys.assembly_files
WHERE name='PointSource';
Jeśli skopiować i wkleić wyniki do edytora tekstów, pojawi się, że podziałów i spacji, które istniały w oryginalnej mają zostały zachowane.
Zarządzanie UDTs i zestawy
Podczas planowania implementacji UDTs należy wziąć pod uwagę metod, które są potrzebne w zestawie UDT sam i metod, które mają zostać utworzone w oddzielnych zestawów i wdrożonych jako funkcje zdefiniowane przez użytkownika lub procedur przechowywanych.Oddzielanie metody do oddzielnych zestawów umożliwia aktualizowanie kod bez wpływu na dane, które mogą być przechowywane kolumna UDT w tabela.Można zmodyfikować zestawy UDT nie upuszczanie UDT kolumn i inne obiekty zależne tylko wtedy, gdy nowa definicja może odczytać poprzednie wartości i podpis tego typu nie ulega zmianie.
Oddzielanie procedurach kod, który może się zmieniać w zależności od kodu, niezbędnych do zaimplementowania UDT znacznie upraszcza konserwację.Włączając tylko kod, który jest niezbędne do UDT do funkcja i utrzymywanie definicji UDT tak proste, jak to możliwe, zmniejsza ryzyko, że zostanie usunięty z bazy danych dla kodu poprawki lub rozwiązania błędów UDT, sam może być konieczne.
Waluta UDT i funkcja konwersji walut
The Currency UDT in the AdventureWorks sample database provides a useful example of the recommended way to structure a UDT and its associated functions.The Currency UDT is used for handling money based on the monetary system of a particular culture, and allows for storage of different currency types, such as dollars, euros, and so forth.Klasa UDT udostępnia jako ciąg znaków, a kwoty pieniężnej, jak nazwa kultury decimal Typ danych. Wszystkie metody serializacji niezbędne są zawarte w wirtualny plik dziennika Definiowanie klasy.Funkcja dokonujących konwersji waluty z kulturą jednego do drugiego jest zaimplementowany jako zewnętrzny funkcji o nazwie ConvertCurrencyi ta funkcja znajduje się w osobny wirtualny plik dziennika.The ConvertCurrency funkcja does its work by retrieving the conversion rate from a tabela in the AdventureWorks database.Czy kiedykolwiek powinien zmienić urządzenie źródłowe kursów wymiany, czy powinny być inne zmiany istniejącego kodu wirtualny plik dziennika można łatwo zmodyfikować bez wpływu na Waluta UDT.
Kod dla Waluta UDT i ConvertCurrency funkcji można znaleźć, instalując typowe przykłady plików wykonywalnych (CLR) języka.Aby uzyskać więcej informacji zobaczConsiderations for Installing SQL Server Samples and Sample Databases.
Za pomocą UDTs we wszystkich baz danych
UDTs jest definicja obejmuje zasięgiem jednej bazy danych.Dlatego UDT, zdefiniowany w jednej bazie danych nie można używać w definicji kolumna w innej bazie danych.Aby użyć UDTs w wielu baz danych, należy wykonać instrukcje CREATE MONTAŻOWYCH i CREATE TYPE w każdej bazie danych na identycznych zestawów.Zespoły są traktowane jako identyczne takiej samej nazwie, silnej nazwy, kultury, wersja, zestaw uprawnień i binarne zawartości.
Gdy UDT zostanie zarejestrowane i są dostępne w obu baz danych, można przekonwertować wartości UDT z jednej bazy danych do użycia w innym.Identyczne UDTs mogą być używane w bazach danych w następujących scenariuszach:
Telefonicznej przechowywane procedury zdefiniowanej w różnych bazach danych.
Kwerenda tabel zdefiniowanych w różnych bazach danych.
Wybierając UDT dane z jednej bazy danych tabela UDT kolumna, a wstawienia go do drugiej bazy danych z kolumną UDT identyczne.
W takich sytuacjach żadnej konwersji wymagane przez serwer zostanie automatycznie.Nie jest możliwe do wykonania konwersji, używając jawnie Transact-SQL Funkcje CAST lub CONVERT.
Uwaga, że nie trzeba podejmować żadnych działań, za pomocą UDTs po SQL Server Database Engine Tworzenie tabel do pracy w tempdb systemowej bazy danych.Obejmuje to obsługę kursory, zmienne Tabela i funkcji zdefiniowanych przez użytkownika wartości w tabeli zawierających UDTs i które przezroczysty, należy użyć programu tempdb.Jednak jeśli jawnie utworzyć tabela tymczasowa tempdb definiujący kolumna UDT, a następnie UDT musi być zarejestrowany w tempdb taki sam sposób, jak w przypadku baza danych użytkownika.