Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza danych SQL w usłudze Microsoft Fabric
Tworzy typ danych aliasu lub typ zdefiniowany przez użytkownika w bieżącej bazie danych w programie SQL Server lub usłudze Azure SQL Database. Implementacja typu danych aliasu jest oparta na natywnym typie systemu aparatu bazy danych. Typ zdefiniowany przez użytkownika jest implementowany za pomocą klasy zestawu w środowisku uruchomieniowym języka wspólnego programu Microsoft .NET Framework (CLR). Aby powiązać typ zdefiniowany przez użytkownika z implementacją, zestaw CLR zawierający implementację typu musi najpierw zostać zarejestrowany w a aparatu bazy danych przy użyciu polecenia CREATE ASSEMBLY.
Możliwość uruchamiania kodu CLR jest domyślnie wyłączona w programie SQL Server. Można tworzyć, modyfikować i usuwać obiekty bazy danych odwołujące się do modułów kodu zarządzanego. Jednak te odwołania nie są wykonywane w programie SQL Server, chyba że opcja włączona przez clr jest włączona przy użyciu sp_configure.
Note
W tym artykule omówiono integrację środowiska .NET Framework CLR z programem SQL Server. Integracja CLR nie dotyczy bazy danych Azure SQL ani baz danych SQL w Microsoft Fabric, gdzie typy CLR (.NET) nie są obsługiwane.
Transact-SQL konwencje składni
Syntax
Składnia typu danych zdefiniowanego przez użytkownika:
CREATE TYPE [ schema_name. ] type_name
{
FROM base_type
[ ( precision [ , scale ] ) ]
[ NULL | NOT NULL ]
| EXTERNAL NAME assembly_name [ .class_name ]
| AS TABLE ( { <column_definition> | <computed_column_definition> [ , ...n ]
[ <table_constraint> ] [ , ...n ]
[ <table_index> ] [ , ...n ] } )
} [ ; ]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
[
DEFAULT constant_expression ]
| [ IDENTITY [ ( seed , increment ) ]
]
[ ROWGUIDCOL ] [ <column_constraint> [ ...n ] ]
<data type> ::=
[ type_schema_name . ] type_name
[ ( precision [ , scale ] | max |
[ { CONTENT | DOCUMENT } ] xml_schema_collection ) ]
<column_constraint> ::=
{ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[
WITH ( <index_option> [ , ...n ] )
]
| CHECK ( logical_expression )
}
<computed_column_definition> ::=
column_name AS computed_column_expression
[ PERSISTED [ NOT NULL ] ]
[
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[
WITH ( <index_option> [ , ...n ] )
]
| CHECK ( logical_expression )
]
<table_constraint> ::=
{
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
( column [ ASC | DESC ] [ , ...n ] )
[
WITH ( <index_option> [ , ...n ] )
]
| CHECK ( logical_expression )
}
<index_option> ::=
{
IGNORE_DUP_KEY = { ON | OFF }
}
< table_index > ::=
INDEX index_name
[ CLUSTERED | NONCLUSTERED ] (column [ ASC | DESC ] [ , ...n ] )
[INCLUDE (column, ...n)]
Składnia typów tabel zoptymalizowanych pod kątem pamięci zdefiniowanej przez użytkownika:
CREATE TYPE [ schema_name. ] type_name
AS TABLE ( { <column_definition> [ , ...n ] }
| [ <table_constraint> ] [ , ...n ]
| [ <table_index> ] [ , ...n ] )
[ WITH ( <table_option> [ , ...n ] ) ]
[ ; ]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ] [ NULL | NOT NULL ]
[ IDENTITY [ (1 , 1) ]
]
[ <column_constraint> [ , ...n ] ] [ <column_index> ]
<data type> ::=
[ type_schema_name . ] type_name [ ( precision [ , scale ] ) ]
<column_constraint> ::=
{ PRIMARY KEY { NONCLUSTERED HASH WITH ( BUCKET_COUNT = bucket_count )
| NONCLUSTERED }
}
< table_constraint > ::=
{ PRIMARY KEY { NONCLUSTERED HASH (column [ , ...n ] )
WITH ( BUCKET_COUNT = bucket_count )
| NONCLUSTERED ( column [ ASC | DESC ] [ , ...n ] )
}
}
<column_index> ::=
INDEX index_name
{ [ NONCLUSTERED ] HASH (column [ , ...n ] ) WITH ( BUCKET_COUNT = bucket_count )
| NONCLUSTERED ( column [ ASC | DESC ] [ , ...n ] )
}
< table_index > ::=
INDEX index_name
{ [ NONCLUSTERED ] HASH (column [ , ...n ] ) WITH ( BUCKET_COUNT = bucket_count )
| [ NONCLUSTERED ] ( column [ ASC | DESC ] [ , ...n ] )
}
<table_option> ::=
{
[ MEMORY_OPTIMIZED = { ON | OFF } ]
}
Arguments
schema_name
Nazwa schematu, do którego należy typ danych aliasu lub typ zdefiniowany przez użytkownika.
type_name
Nazwa typu danych aliasu lub typu zdefiniowanego przez użytkownika. Nazwy typów muszą być zgodne z regułami dotyczącymi identyfikatorów.
base_type
Aparat bazy danych dostarczył typ danych, na którym bazuje typ danych aliasu. base_type to nazwa systemu bez wartości domyślnej i może być jedną z następujących wartości:
- bigint, int, smallint i tinyint
- binary(n), varbinary(n)i varbinary(max)
- bit
- char(n), nchar(n), nvarchar(n), nvarchar(max), varchar(n), and varchar(max)
- date, datetime, datetime2, datetimeoffset, smalldatetime i time
- dziesiętne i liczbowe
- liczba zmiennoprzecinkowa i rzeczywista
- image
- pieniądze i małe pieniądze
- sql_variant
- tekst i ntekst
- uniqueidentifier
base_type może być również dowolnym synonimem typu danych, który mapuje na jeden z tych typów danych systemowych.
precision
W przypadku liczby dziesiętnej lub liczbowejprecyzja jest nieujemną liczbą całkowitą, która wskazuje maksymalną całkowitą liczbę cyfr dziesiętnych, które mogą być przechowywane, zarówno po lewej stronie, jak i po prawej stronie punktu dziesiętnego. Aby uzyskać więcej informacji, zobacz dziesiętne i liczbowe (Transact-SQL).
scale
W przypadku liczby dziesiętnej lub liczbowej skala jest nieujemną liczbą całkowitą, która wskazuje maksymalną liczbę cyfr dziesiętnych, które mogą być przechowywane po prawej stronie punktu dziesiętnego i musi być mniejsza niż lub równa precyzji. Aby uzyskać więcej informacji, zobacz dziesiętne i liczbowe (Transact-SQL).
NULL | NIE NULL
Określa, czy typ może przechowywać wartość null. Jeśli nie zostanie określony, NULL jest wartością domyślną.
assembly_name
Dotyczy: SQL Server
Określa zestaw programu SQL Server odwołujący się do implementacji typu zdefiniowanego przez użytkownika w środowisku uruchomieniowym języka wspólnego. assembly_name powinny być zgodne z istniejącym zestawem w programie SQL Server w bieżącej bazie danych.
Note
EXTERNAL_NAME nie jest dostępna w zawartej bazie danych.
[ . class_name ]
Dotyczy: SQL Server
Określa klasę w zestawie, która implementuje typ zdefiniowany przez użytkownika. class_name musi być prawidłowym identyfikatorem i musi istnieć jako klasa w zestawie z widocznością zestawu. class_name uwzględnia wielkość liter, niezależnie od sortowania bazy danych i musi dokładnie odpowiadać nazwie klasy w odpowiednim zestawie. Nazwa klasy może być nazwą kwalifikowaną przestrzeni nazw ujętą w nawiasy kwadratowe ([ ]), jeśli język programowania używany do pisania klasy używa koncepcji przestrzeni nazw, takich jak C#. Jeśli nie określono class_name , program SQL Server zakłada, że jest taki sam jak type_name.
<column_definition>
Definiuje kolumny dla typu tabeli zdefiniowanej przez użytkownika.
<typ danych>
Definiuje typ danych w kolumnie dla typu tabeli zdefiniowanej przez użytkownika. Aby uzyskać więcej informacji na temat typów danych, zobacz Typy danych (Transact-SQL). Aby uzyskać więcej informacji na temat tabel, zobacz CREATE TABLE (Transact-SQL).
<column_constraint>
Definiuje ograniczenia kolumn dla typu tabeli zdefiniowanej przez użytkownika. Obsługiwane ograniczenia obejmują PRIMARY KEY, UNIQUEi CHECK. Aby uzyskać więcej informacji na temat tabel, zobacz CREATE TABLE (Transact-SQL).
<computed_column_definition>
Definiuje obliczone wyrażenie kolumny jako kolumnę w typie tabeli zdefiniowanej przez użytkownika. Aby uzyskać więcej informacji na temat tabel, zobacz CREATE TABLE (Transact-SQL).
<table_constraint>
Definiuje ograniczenie tabeli dla typu tabeli zdefiniowanego przez użytkownika. Obsługiwane ograniczenia obejmują PRIMARY KEY, UNIQUEi CHECK.
<index_option>
Określa odpowiedź błędu na zduplikowane wartości klucza w operacji wstawiania wielu wierszy w unikatowym klastrowanym lub unikatowym indeksie nieklastrowanym. Aby uzyskać więcej informacji na temat opcji indeksu, zobacz TWORZENIE INDEKSU (Transact-SQL).
INDEX_NAME INDEKSU [ KLASTROWANE | NONCLUSTERED ] ( column_name [ ASC | DESC ] [ , ... n ] )
Dotyczy: SQL Server 2014 (12.x) i nowsze wersje, Azure SQL Database i Azure SQL Managed Instance.
Określa, aby utworzyć indeks w tabeli. Może to być indeks klastrowany lub indeks nieklastrowany. Indeks zawiera wymienione kolumny i sortuje dane w kolejności rosnącej lub malejącej.
INDEX
Musisz określić indeksy kolumn i tabel w ramach instrukcji CREATE TABLE .
CREATE INDEX i DROP INDEX nie są obsługiwane w przypadku tabel zoptymalizowanych pod kątem pamięci.
MEMORY_OPTIMIZED
Dotyczy: SQL Server 2014 (12.x) i nowsze wersje, Azure SQL Database i Azure SQL Managed Instance. Usługa Azure SQL Managed Instance nie obsługuje tabel zoptymalizowanych pod kątem pamięci w warstwie Ogólnego przeznaczenia.
Wskazuje, czy typ tabeli jest zoptymalizowany pod kątem pamięci. Ta opcja jest domyślnie wyłączona; tabela (typ) nie jest tabelą zoptymalizowaną pod kątem pamięci (typem). Typy tabel zoptymalizowane pod kątem pamięci to tabele użytkowników zoptymalizowane pod kątem pamięci, których schemat jest utrwalany na dysku podobny do innych tabel użytkowników.
BUCKET_COUNT
Dotyczy: SQL Server 2014 (12.x) i nowsze wersje, Azure SQL Database, Azure SQL Database i Azure SQL Managed Instance.
Wskazuje liczbę zasobników, które powinny zostać utworzone w indeksie skrótu. Maksymalna wartość dla BUCKET_COUNT indeksów skrótów wynosi 1073 741 824. Aby uzyskać więcej informacji na temat liczby zasobników, zobacz Indeksy w tabelach Memory-Optimized.
bucket_count jest argumentem wymaganym.
HASH
Dotyczy: SQL Server 2014 (12.x) i nowsze wersje, Azure SQL Database, Azure SQL Database i Azure SQL Managed Instance.
Wskazuje, że HASH indeks jest tworzony. Indeksy skrótów są obsługiwane tylko w tabelach zoptymalizowanych pod kątem pamięci.
Remarks
Klasa zestawu, do którego odwołuje się assembly_name wraz z jego metodami, powinna spełniać wszystkie wymagania dotyczące implementowania typu zdefiniowanego przez użytkownika w programie SQL Server. Aby uzyskać więcej informacji na temat tych wymagań, zobacz CLR User-Defined Types (Typy User-Defined CLR).
Dodatkowe zagadnienia obejmują następujące kwestie:
Klasa może zawierać metody przeciążone, ale te metody mogą być wywoływane tylko z poziomu kodu zarządzanego, a nie z języka Transact-SQL.
Wszystkie statyczne elementy członkowskie muszą być zadeklarowane jako const lub readonly , jeśli assembly_name jest
SAFElubEXTERNAL_ACCESS.
W bazie danych może istnieć tylko jeden typ zdefiniowany przez użytkownika zarejestrowany dla dowolnego określonego typu, który został przekazany w programie SQL Server z clR. Jeśli typ zdefiniowany przez użytkownika jest tworzony na typie CLR, dla którego typ zdefiniowany przez użytkownika już istnieje w bazie danych, CREATE TYPE kończy się niepowodzeniem z powodu błędu. To ograniczenie jest wymagane, aby uniknąć niejednoznaczności podczas rozpoznawania typu SQL, jeśli typ CLR można zamapować na więcej niż jeden typ zdefiniowany przez użytkownika.
Jeśli jakakolwiek metodamutatora w typie nie zwraca wartości void, CREATE TYPE instrukcja nie jest wykonywana.
Aby zmodyfikować typ zdefiniowany przez użytkownika, należy usunąć typ przy użyciu DROP TYPE instrukcji , a następnie utworzyć go ponownie.
W przeciwieństwie do typów zdefiniowanych przez użytkownika, które są tworzone przy użyciu programu sp_addtype, rola publicznej bazy danych nie ma automatycznie przyznanych REFERENCES uprawnień do typów utworzonych przy użyciu programu CREATE TYPE. To uprawnienie musi być przyznane oddzielnie.
W typach tabel zdefiniowanych przez użytkownika ustrukturyzowane typy zdefiniowane przez użytkownika, które są używane w column_name<typie> danych, są częścią zakresu schematu bazy danych, w którym zdefiniowano typ tabeli. Aby uzyskać dostęp do typów zdefiniowanych przez użytkownika ze strukturą w innym zakresie w bazie danych, użyj nazw dwuczęściowych.
W typach tabel zdefiniowanych przez użytkownika klucz podstawowy w kolumnach obliczeniowych musi mieć PERSISTED wartość i NOT NULL.
W usłudze Fabric SQL Database można tworzyć typy zdefiniowane przez użytkownika, ale nie są dublowane w usłudze Fabric OneLake, a kolumny typów zdefiniowanych przez użytkownika są pomijane w dublowaniu.
Typy tabel zoptymalizowane pod kątem pamięci
Począwszy od programu SQL Server 2014 (12.x), przetwarzanie danych w typie tabeli może odbywać się w pamięci podstawowej, a nie na dysku. Aby uzyskać więcej informacji, zobacz In-Memory OMÓWIENIE OLTP i scenariusze użycia. Aby zapoznać się z przykładami kodu pokazującymi sposób tworzenia typów tabel zoptymalizowanych pod kątem pamięci, zobacz Tworzenie tabeli Memory-Optimized i natywnie skompilowanej procedury składowanej.
Permissions
Wymaga CREATE TYPE uprawnień w bieżącej bazie danych i ALTER uprawnieniach w schema_name. Jeśli nie określono schema_name , mają zastosowanie domyślne reguły rozpoznawania nazw do określania schematu dla bieżącego użytkownika. Jeśli określono assembly_name , użytkownik musi być właścicielem zestawu lub mieć REFERENCES na nim uprawnienia.
Jeśli jakiekolwiek kolumny w instrukcji CREATE TABLE są zdefiniowane jako typ zdefiniowany przez użytkownika, REFERENCES wymagane jest uprawnienie do typu zdefiniowanego przez użytkownika.
Użytkownik tworzący tabelę z kolumną używającą typu zdefiniowanego przez użytkownika musi REFERENCES mieć uprawnienia do typu zdefiniowanego przez użytkownika. Jeśli ta tabela musi zostać utworzona w tempdbprogramie , REFERENCES uprawnienie musi zostać przyznane jawnie za każdym razem przed utworzeniem tabeli lub tego typu danych i REFERENCES uprawnienia należy dodać do model bazy danych. Przykład:
CREATE TYPE dbo.udt_money FROM varchar(11) NOT NULL;
GO
GRANT REFERENCES ON TYPE::dbo.udt_money TO public
Jeśli tak się stanie, ten typ danych i REFERENCES uprawnienia będą dostępne tempdb trwale. W przeciwnym razie typ danych zdefiniowany przez użytkownika i uprawnienia znikną po ponownym uruchomieniu programu SQL Server. Aby uzyskać więcej informacji, zobacz CREATE TABLE.
Jeśli nie chcesz, aby każda nowa baza danych dziedziczyła definicję i uprawnienia dla tego typu danych zdefiniowanego przez użytkownika z modelu, możesz użyć procedury składowanej uruchamiania, aby utworzyć i przypisać odpowiednie uprawnienia tylko w tempdb bazie danych. Przykład:
USE master
GO
CREATE PROCEDURE setup_udt_in_tempdb
AS
EXEC ( 'USE tempdb;
CREATE TYPE dbo.udt_money FROM varchar(11) NOT NULL;
GRANT REFERENCES ON TYPE::dbo.udt_money TO public;')
GO
EXEC sp_procoption 'setup_udt_in_tempdb' , 'startup' , 'on'
GO
Alternatywnie, zamiast używać tabel tymczasowych, rozważ użycie zmiennych tabeli, jeśli musisz odwołać się do typów danych zdefiniowanych przez użytkownika na potrzeby magazynu tymczasowego. Aby zmienne tabeli odwoły się do typów danych zdefiniowanych przez użytkownika, nie trzeba jawnie udzielać uprawnień dla typu danych zdefiniowanych przez użytkownika.
Examples
A. Tworzenie typu aliasu na podstawie typu danych varchar
Poniższy przykład tworzy typ aliasu na podstawie typu danych dostarczonego varchar przez system.
CREATE TYPE SSN
FROM VARCHAR(11) NOT NULL;
B. Tworzenie typu zdefiniowanego przez użytkownika
Dotyczy: SQL Server
Poniższy przykład tworzy typ Utf8String , który odwołuje się do klasy utf8string w zestawie utf8string. Przed utworzeniem typu zestaw utf8string jest zarejestrowany w lokalnej bazie danych. Zastąp część binarną instrukcji CREATE ASSEMBLY prawidłowym opisem.
CREATE ASSEMBLY utf8string
AUTHORIZATION [dbi]
FROM 0x4D... ;
GO
CREATE TYPE Utf8String
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string];
GO
C. Tworzenie typu tabeli zdefiniowanej przez użytkownika
W poniższym przykładzie tworzony jest typ tabeli zdefiniowanej przez użytkownika, który ma dwie kolumny. Aby uzyskać więcej informacji na temat tworzenia i używania parametrów z wartościami tabeli, zobacz Use Table-Valued Parameters (Database Engine) (Używanie parametrów Table-Valued (aparat bazy danych).
CREATE TYPE LocationTableType AS TABLE (
LocationName VARCHAR(50),
CostRate INT
);
GO
D. Tworzenie typu tabeli zdefiniowanej przez użytkownika przy użyciu klucza podstawowego i indeksu
Poniższy przykład tworzy typ tabeli zdefiniowanej przez użytkownika, który ma trzy kolumny, z których jeden (Name) jest kluczem podstawowym, a drugi (Price) ma indeks nieklastrowany. Aby uzyskać więcej informacji na temat tworzenia i używania parametrów z wartościami tabeli, zobacz Use Table-Valued Parameters (Database Engine) (Używanie parametrów Table-Valued (aparat bazy danych).
CREATE TYPE InventoryItem AS TABLE (
[Name] NVARCHAR(50) NOT NULL,
SupplierId BIGINT NOT NULL,
Price DECIMAL(18, 4) NULL,
PRIMARY KEY (Name),
INDEX IX_InventoryItem_Price(Price)
);
GO