Udostępnij za pośrednictwem


Rejestrowanie typów zdefiniowanych 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 obejmuje rejestrowanie wirtualny plik dziennika i tworzenie typ bazy danych, w którym chcesz go używać.UDTs są obejmuje zasięgiem jednej bazy danych i nie można używać wielu baz danych, chyba że identyczne wirtualny plik dziennika i UDT są zarejestrowane z każdej bazy danych.Po wirtualny plik dziennika UDT jest zarejestrowany i utworzony typ można użyć UDT w Transact-SQL i kod klient.Aby uzyskać więcej informacji, zobacz CLR typów zdefiniowanych przez użytkownika.

Za pomocą programu Visual Studio UDTs

Najłatwiejszym sposobem wdrożyć programu UDT jest za pomocą Microsoft programu Visual Studio.Dla bardziej złożonych scenariuszy wdrażania i elastyczności, jednak korzystać z Transact-SQL , omówiono w dalszej części tego tematu.

Wykonaj następujące kroki, aby utworzyć i wdrożyć UDT przy użyciu programu Visual Studio:

  1. Utwórz nowy bazy danych projektu w Visual Basic lub Visual C# język węzłów.

  2. Dodaj odwołanie do SQL Server bazy danych będzie zawierać UDT.

  3. Dodaj Typu zdefiniowanego przez użytkownika klasy.

  4. Napisać kod w celu zaimplementowania UDT.

  5. Z Tworzenie menu wybierz Wdrażanie.Rejestruje to wirtualny plik dziennika i tworzy typ w SQL Server bazy danych.

Za pomocą języka Transact-SQL UDTs

Transact-SQL Tworzenie wirtualny plik dziennika składnia jest używana do rejestrowania zestawów w bazie danych, w którym chcesz używać UDT.Są wewnętrznie przechowywane w bazie danych tabele systemowe, nie zewnętrznie w systemie plików.Jeśli UDT jest zależna od zewnętrznych zestawów, zbyt muszą być ładowane do bazy danych.Instrukcja utworzyć typ jest używany do tworzenia UDT w bazie danych, w którym ma być używany.Aby uzyskać więcej informacji, zobacz Tworzenie zestawu (Transact-SQL) i Tworzenie typu języka Transact-SQL).

Używanie Tworzenie zestawu

Tworzenie wirtualny plik dziennika składni rejestruje zgromadzenie w bazie danych, w którym chcesz używać UDT.Zarejestrowany wirtualny plik dziennika ma żadnych zależności.

Tworzenie wielu wersji tego samego wirtualny plik dziennika danej bazy 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 używanie Strong-Named zespołów" w.NET Framework SDK.

Podczas tworzenia wirtualny plik dziennika jest wykonywane z uprawnieniem bezpieczne lub EXTERNAL_ACCESS Ustawia, zgromadzenie jest sprawdzany upewnij się, że jest możliwe do zweryfikowania i wpisz bezpieczne.Jeśli pominięto, określając 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 Zespoły projektowanie.

Przykład

Następujące Transact-SQL instrukcja rejestruje punkt wirtualny plik dziennika w SQL Server w AdventureWorks2008R2 bazy danych z bezpiecznych uprawnienie zestaw.Jeśli PERMISSION_ Zwirtualny plik dziennika klauzula jest pominięty, zgromadzenie jest zarejestrowany z uprawnieniem bezpiecznego wirtualny plik dziennika.

USE AdventureWorks2008R2;
CREATE ASSEMBLY Point
FROM '\\ShareName\Projects\Point\bin\Point.dll' 
WITH PERMISSION_SET = SAFE;

Następujące Transact-SQL instrukcja rejestruje wirtualny plik dziennika za pomocą <specyfikatorze> argumentu w klauzula FROM.To varbinary wartość reprezentuje plik jako strumień bajtów.

USE AdventureWorks2008R2;
CREATE ASSEMBLY Point
FROM 0xfeac4 … 21ac78;

Tworzenie typu

Gdy wirtualny plik dziennika jest załadowany do bazy danych, można utworzyć przy użyciu typu Transact-SQL typu Tworzenie instrukcja.Typ to dodaje do listy dostępnych typów danej bazy danych.Typ ma zakres bazy danych i typu należy używać tylko w bazie danych, w którym został utworzony.Jeśli UDT już istnieje w bazie danych utworzyć typ instrukcja błąd.

Ostrzeżenie

Składnia utworzyć typ jest również używany do tworzenia macierzystym SQL Server alias danych typów i zastąpić sp_addtype jako sposób tworzenia aliasu typów danych.Niektóre z argumentów opcjonalnych w składni utworzyć typ odnoszą się do tworzenia UDTs i nie są stosowane do tworzenia alias typów danych (np. typ podstawowy).

Ostrzeżenie

Począwszy od SQL Server 2005, na SQL Server bazy danych z poziom zgodności "80" nie można utworzyć typy zarządzane przez użytkownika, procedura składowana, funkcje, agregatów ani wyzwalaczy. Aby skorzystać z tych funkcji integracja CLR z SQL Server, należy użyć sp_dbcmptlevel (języka Transact-SQL) przechowywane procedury zestaw poziom zgodności bazy danych "100".

Aby uzyskać więcej informacji, zobacz Tworzenie typu języka Transact-SQL).

Przykład

Następujące Transact-SQL instrukcja tworzy Point typu.ZEWNĘTRZNE 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 UDT jest odrzucone, można użyć instrukcja DROP wirtualny plik dziennika upuścić wirtualny plik dziennika z bazy danych.

Instrukcja DROP TYPE nie wykonać 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 i parametrów UDT, utworzone w bazie danych z klauzula Z SCHEMABINDING.

Przykład

Następujące Transact-SQL należy wykonać w następującej kolejności.Pierwsza tabela, do której odwołuje się do Point UDT musi porzucone, następnie typu i 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 UDT kolumna definicje, instrukcja DROP TYPE nie powiedzie się.Nie jest on również w przypadku procedur przechowywanych, funkcji lub wyzwalacze utworzone w bazie danych przy użyciu klauzula SCHEMABINDING Z 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.

Następujące Transact-SQL kwerendy Lokalizuje wszystkie kolumny i parametry, które używają UDT w AdventureWorks2008R2bazy danych.

USE Adventureworks2008R2;
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;

Obsługa UDTs

Nie można modyfikować UDT utworzone w SQL Server bazy danych, chociaż można zmieniać wirtualny plik dziennika, na którym oparty jest typ.W większości przypadków UDT należy usunąć z bazy danych z Transact-SQL instrukcja DROP TYPE zmian do wirtualny plik dziennika podstawowego i załadować ponownie przy użyciu instrukcja ALTER wirtualny plik dziennika.Następnie należy ponownie utworzyć UDT i wszystkie obiekty zależne.

Przykład

Instrukcja ALTER zestaw jest używany po dokonaniu zmian w źródło kodu w zestawie UDT sieci i ponownie kompilowana go.Kopiuje plik .dll na serwerze i rebinds do nowego wirtualny plik dziennika.Aby pełną składnię, zobacz Zmiana zestawu (Transact-SQL).

Następujące Transact-SQL instrukcja ALTER wirtualny plik dziennika ładuje wirtualny plik dziennika Point.dll z określonej lokalizacji na dysku.

ALTER ASSEMBLY Point
FROM '\\Projects\Point\bin\Point.dll';

Dodawanie kodu źródłowego przy użyciu zestawu ALTER

W składni ALTER zestawu klauzula Dodaj plik jest nieobecny w tworzenie zestawu.Służy do dodawania źródło kod lub innych plików skojarzonych z wirtualny plik dziennika.Pliki są kopiowane z oryginalnych lokalizacji i przechowywane w tabele systemowe w bazie danych.Dzięki temu zawsze źródło kod lub inne pliki zapasów należy konieczności odtworzenia lub dokumentu bieżącą wersja UDT.

Następujące Transact-SQL instrukcja ALTER zestawu Dodaje klasę Point.cs źródło kod dla punkt UDT.Kopiuje tekst zawarty 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;

Zgromadzenie informacje są przechowywane w sys.assembly_files tabela w bazie danych, w którym zainstalowano wirtualny plik dziennika.Sys.assembly_files tabela zawiera następujące kolumny.

  • assembly_id
    Identyfikator zdefiniowany dla wirtualny plik dziennika.Ten numer jest przypisywany do wszystkich obiektów, odnoszących się do tego samego wirtualny plik dziennika.

  • name
    Nazwa obiektu.

  • file_id
    Liczba identyfikująca każdy obiekt z pierwszego obiektu skojarzonego z danym assembly_id podane są wartości 1.Jeśli istnieje wiele obiektów skojarzonych z tym samym assembly_id, następnie każda następna file_id wartość jest zwiększana o 1.

  • zawartość
    Reprezentacja szesnastkowym pliku lub wirtualny plik dziennika.

Można użyć funkcja RZUTOWANIA lub konwersji do konwertowania zawartości zawartości kolumna tekst czytelny.Następująca kwerenda konwertuje tekst czytelny, używając nazwy w klauzula WHERE, aby ograniczyć zawartość pliku Point.cs zestaw wyników do jednego wiersza.

SELECT CAST(content AS varchar(8000)) 
  FROM sys.assembly_files 
  WHERE name='PointSource';

Jeśli skopiować i wkleić wyniki do edytora tekstu, zostanie wyświetlony, że zostały zakonserwowane podziałów i spacji, które istniały w oryginale.

Zarządzanie UDTs i zespołów

Podczas planowania implementacji UDTs, należy rozważyć metod, które są potrzebne w UDT wirtualny plik dziennika sobie i metod, które powinny zostać utworzone w oddzielnych zespołów i wdrożonych jako funkcje zdefiniowane przez użytkownika lub procedur przechowywanych.Oddzielanie metod do oddzielnych zespołów umożliwia aktualizowanie kodu bez wpływu na dane, które mogą być przechowywane kolumna UDT w tabela.Można modyfikować zestawy UDT bez usuwania kolumn UDT i inne obiekty zależne, tylko w przypadku, gdy nowa definicja może odczytać wartości byłego i podpis typu nie zmienia się.

Oddzielanie procedurach kod, który może zmienić kod wymagane do wykonania UDT znacznie upraszcza konserwację.Włączając kod jest konieczne dla UDT funkcja i aktualizowanie definicji UDT możliwie najprostsze, ogranicza ryzyko, że usunięty z bazy danych dla kodu korekt lub poprawek UDT, sam może być konieczne.

Waluta UDT i funkcję konwersji waluty

Waluty UDT w AdventureWorks2008R2 Przykładowa baza danych zawiera przydatne przykład zalecany sposób strukturę typ zdefiniowany przez użytkownika i jego funkcje skojarzone.Waluty UDT jest używany do obsługi pieniędzy na podstawie systemu walutowego określonej kultury i umożliwia gromadzenie różnych walut typów, takich jak dolarów, euro i tak dalej.Klasa UDT uwidacznia nazwa kultury jako ciąg i kwoty pieniężnej jako decimal typu danych.Wszystkie metody serializacji niezbędne są zawarte w wirtualny plik dziennika Definiowanie klasy.Funkcja, która implementuje Konwersja waluty z jednego kultury na inny jest zaimplementowany jako funkcję zewnętrzną, o nazwie ConvertCurrency, i ta funkcja znajduje się oddzielnie w wirtualny plik dziennika.ConvertCurrency funkcja działa jej pobierając kurs wymiany z tabela w AdventureWorks2008R2 bazy danych.Jeśli kiedykolwiek należy zmienić źródło kursów przeliczeniowych lub powinny być inne zmiany istniejącego kodu wirtualny plik dziennika można łatwo zmodyfikować bez wpływu na waluty UDT.

Kod dla waluty UDT i ConvertCurrency funkcji można znaleźć instalując wspólnego języka próbki runtime (CLR).Aby uzyskać więcej informacji, zobacz Zagadnienia dotyczące instalowania przykładów i przykładowych baz danych programu SQL Server.

Za pomocą UDTs w różnych bazach danych

UDTs są z definicji zakresu do jednej bazy danych.Dlatego UDT zdefiniowane 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 tworzenia zestawu i typu tworzenie w każdej bazie danych na identycznych zespołów.Zespoły są uważane za identyczne, jeżeli posiadają tą samą nazwą silnej nazwy, kultury, wersja, zestaw uprawnień i binarne treści.

Gdy UDT zarejestrowanych i dostępne w obu baz danych, można przekonwertować wartości UDT z jednej bazy danych do użycia w innym.Identyczne UDTs może być używany w różnych bazach danych w następujących scenariuszach:

  • Wywołanie procedura składowana określonych w różnych baz danych.

  • Kwerenda tabel zdefiniowanych w różnych bazach danych.

  • Wybieranie UDT danych z jednej bazy danych tabela UDT kolumna a wstawieniem do drugiej bazy danych o identycznych kolumna UDT.

W takich sytuacjach żadnej konwersji wymagane przez serwer zostanie automatycznie.Nie jesteś w stanie dokonać konwersji jawnie przy użyciu Transact-SQL ODDANYCH lub PRZEKONWERTOWAĆ funkcji.

Uwaga, że nie trzeba podjąć jakikolwiek akcja za pomocą UDTs po Aparat baz danych programu SQL Server tworzy tabele pracy w tempdb systemowej bazy danych.Obejmuje obsługę kursory zmiennych Tabela i dokonaj zdefiniowanej przez użytkownika funkcji oródwierszową zawierających UDTs oraz że przezroczysty stosowania tempdb.Jednakże jeśli tworzone jawnie tabela tymczasowa w tempdb definiuje UDT kolumna, a następnie UDT musi być zarejestrowany w tempdb taki sam sposób jak dla baza danych użytkownika.