Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Microsoft Fabric'te SQL veritabanı
SQL Server veya Azure SQL Veritabanı'ndaki geçerli veritabanında bir diğer ad veri türü veya kullanıcı tanımlı bir tür oluşturur. Diğer ad veri türünün uygulanması, Veritabanı Altyapısı yerel sistem türünü temel alır. Kullanıcı tanımlı tür, Microsoft .NET Framework ortak dil çalışma zamanında (CLR) bir derleme sınıfı aracılığıyla uygulanır. Kullanıcı tanımlı bir türü uygulamasına bağlamak için, türün uygulamasını içeren CLR derlemesinin önce CREATE ASSEMBLY kullanılarak Veritabanı Altyapısı'na kaydedilmesi gerekir.
SQL Server'da CLR kodunu çalıştırma özelliği varsayılan olarak kapalıdır. Yönetilen kod modüllerine başvuran veritabanı nesneleri oluşturabilir, değiştirebilir ve bırakabilirsiniz. Ancak, clr özellikli Seçeneksp_configure kullanılarak etkinleştirilmediği sürece bu başvurular SQL Server'da yürütülemez.
Note
.NET Framework CLR'nin SQL Server ile tümleştirilmesi bu makalede ele alınmıştır. CLR entegrasyonu, Microsoft Fabric'teki Azure SQL Database veya SQL veritabanı için geçerli değildir; burada CLR (.NET) tipleri desteklenmez.
Transact-SQL söz dizimi kuralları
Syntax
Kullanıcı tanımlı veri türü söz dizimi:
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)]
Kullanıcı tanımlı bellek için iyileştirilmiş tablo türleri söz dizimi:
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
Diğer ad veri türünün veya kullanıcı tanımlı türün ait olduğu şemanın adı.
type_name
Diğer ad veri türünün veya kullanıcı tanımlı türün adı. Tür adları , tanımlayıcıların kurallarına uymalıdır.
base_type
Diğer ad veri türünün temel aldığı Veritabanı Altyapısı tarafından sağlanan veri türü. base_typesysname'dir ve varsayılan değer yoktur ve aşağıdaki değerlerden biri olabilir:
- bigint, int, smallint ve tinyint
- binary(n), varbinary(n)ve varbinary(max)
- bit
- char(n), nchar(n), nvarchar(n), nvarchar(max), varchar(n)ve varchar(max)
- date, datetime, datetime2, datetimeoffset, smalldatetime ve time
- ondalık ve sayısal
- float ve gerçek
- image
- para ve küçük para
- sql_variant
- metin ve ntext
- uniqueidentifier
base_type , bu sistem veri türlerinden biriyle eşleşen herhangi bir veri türü eş anlamlısı da olabilir.
precision
Ondalık veya sayısal için duyarlık, ondalık noktasının hem solunda hem de sağ tarafında depolanabilen toplam ondalık basamak sayısını gösteren negatif olmayan bir tamsayıdır. Daha fazla bilgi için bkz. ondalık ve sayısal (Transact-SQL).
scale
Ondalık veya sayısal için ölçek, ondalık noktasının sağındaki en fazla ondalık basamak sayısını gösteren negatif olmayan bir tamsayıdır ve duyarlık değerinden küçük veya buna eşit olmalıdır. Daha fazla bilgi için bkz. ondalık ve sayısal (Transact-SQL).
NULL | NOT NULL
Türün null değer barındırıp tutamayacağını belirtir. Belirtilmezse, NULL varsayılan değerdir.
assembly_name
Şunlar için geçerlidir: SQL Server
Ortak dil çalışma zamanında kullanıcı tanımlı türün uygulanmasına başvuran SQL Server derlemesini belirtir. assembly_name geçerli veritabanındaki SQL Server'daki mevcut bir derlemeyle eşleşmelidir.
Note
EXTERNAL_NAME , kapsanan bir veritabanında kullanılamaz.
[ . class_name ]
Şunlar için geçerlidir: SQL Server
Kullanıcı tanımlı türü uygulayan derleme içindeki sınıfı belirtir. class_name geçerli bir tanımlayıcı olmalı ve derleme görünürlüğü ile derlemede sınıf olarak bulunmalıdır. class_name , veritabanı harmanlamadan bağımsız olarak büyük/küçük harfe duyarlıdır ve ilgili derlemedeki sınıf adıyla tam olarak eşleşmelidir. Sınıfı yazmak için kullanılan programlama dili C# gibi ad alanları kavramını kullanıyorsa, sınıf adı köşeli ayraç ([ ]) içine alınmış ad alanı nitelenmiş bir ad alanı adı olabilir. class_name belirtilmezse, SQL Server bunun type_name ile aynı olduğunu varsayar.
<column_definition>
Kullanıcı tanımlı tablo türünün sütunlarını tanımlar.
<veri türü>
Kullanıcı tanımlı tablo türü için bir sütundaki veri türünü tanımlar. Veri türleri hakkında daha fazla bilgi için bkz. Veri Türleri (Transact-SQL). Tablolar hakkında daha fazla bilgi için bkz. CREATE TABLE (Transact-SQL).
<column_constraint>
Kullanıcı tanımlı tablo türü için sütun kısıtlamalarını tanımlar. Desteklenen kısıtlamalar arasında PRIMARY KEY, UNIQUEve CHECKbulunur. Tablolar hakkında daha fazla bilgi için bkz. CREATE TABLE (Transact-SQL).
<computed_column_definition>
Hesaplanan sütun ifadesini kullanıcı tanımlı tablo türünde bir sütun olarak tanımlar. Tablolar hakkında daha fazla bilgi için bkz. CREATE TABLE (Transact-SQL).
<table_constraint>
Kullanıcı tanımlı tablo türünde bir tablo kısıtlaması tanımlar. Desteklenen kısıtlamalar arasında PRIMARY KEY, UNIQUEve CHECKbulunur.
<index_option>
Benzersiz kümelenmiş veya benzersiz bir kümelenmemiş dizinde çok satırlı ekleme işleminde yinelenen anahtar değerlerine yönelik hata yanıtını belirtir. Dizin seçenekleri hakkında daha fazla bilgi için bkz: DİZİNİ OLUŞTUR (Transact-SQL).
INDEX index_name [ CLUSTERED | NONCLUSTERED ] ( column_name [ ASC | DESC ] [ , ... n ] )
Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği.
Tabloda dizin oluşturulmasını belirtir. Bu kümelenmiş dizin veya kümelenmemiş dizin olabilir. Dizin, listelenen sütunları içerir ve verileri artan veya azalan düzende sıralar.
INDEX
Sütun ve tablo dizinlerini deyiminin CREATE TABLE bir parçası olarak belirtmeniz gerekir.
CREATE INDEX ve DROP INDEX bellek için iyileştirilmiş tablolar için desteklenmez.
MEMORY_OPTIMIZED
Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği. Azure SQL Yönetilen Örneği, Genel Amaçlı katmanında bellek için iyileştirilmiş tabloları desteklemez.
Tablo türünün bellek için iyileştirilmiş olup olmadığını gösterir. Bu seçenek varsayılan olarak kapalıdır; tablo (tür), bellek için iyileştirilmiş bir tablo (tür) değildir. Bellek için iyileştirilmiş tablo türleri, şeması diğer kullanıcı tablolarına benzer şekilde diskte kalıcı olan bellek için iyileştirilmiş kullanıcı tablolarıdır.
BUCKET_COUNT
Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri, Azure SQL Veritabanı, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği.
Karma dizinde oluşturulması gereken demet sayısını gösterir. Karma dizinlerdeki için BUCKET_COUNT en yüksek değer 1.073.741.824'dür. Demet sayıları hakkında daha fazla bilgi için bkz. Memory-Optimized Tablolarındaki Dizinler.
bucket_count gerekli bir bağımsız değişkendir.
HASH
Şunlar için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümleri, Azure SQL Veritabanı, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği.
Bir HASH dizinin oluşturulduğunu gösterir. Karma dizinler yalnızca bellek için iyileştirilmiş tablolarda desteklenir.
Remarks
assembly_name'de başvuruda bulunan derlemenin sınıfı, yöntemleriyle birlikte SQL Server'da kullanıcı tanımlı bir tür uygulamak için tüm gereksinimleri karşılamalıdır. Bu gereksinimler hakkında daha fazla bilgi için bkz. CLR User-Defined Türleri.
Dikkat edilmesi gereken diğer noktalar şunlardır:
sınıfı aşırı yüklenmiş yöntemler içerebilir, ancak bu yöntemler Transact-SQL'den değil, yalnızca yönetilen kodun içinden çağrılabilir.
assembly_name veya ise tüm statik üyeler
SAFEveyaEXTERNAL_ACCESSbildirilmelidir.
Veritabanında, CLR'den SQL Server'a yüklenmiş belirtilen herhangi bir türe göre kaydedilmiş yalnızca bir kullanıcı tanımlı tür olabilir. Veritabanında kullanıcı tanımlı bir türün zaten var olduğu bir CLR türünde kullanıcı tanımlı bir tür oluşturulursa, CREATE TYPE hatayla başarısız olur. Bir CLR türü birden fazla kullanıcı tanımlı türe eşlenebiliyorsa SQL Türü çözümlemesi sırasında belirsizlik yaşanmaması için bu kısıtlama gereklidir.
Türündeki herhangi bir mutator yöntemi void döndürmezse, CREATE TYPE deyimi yürütülmüyor.
Kullanıcı tanımlı bir türü değiştirmek için, deyimini DROP TYPE kullanarak türü bırakmanız ve sonra yeniden oluşturmanız gerekir.
kullanılarak sp_addtypeoluşturulan kullanıcı tanımlı türlerden farklı olarak, genel veritabanı rolüne kullanılarak REFERENCESoluşturulan türler üzerinde otomatik olarak izin verilmezCREATE TYPE. Bu izin ayrı olarak verilmelidir.
Kullanıcı tanımlı tablo türlerinde, column_name<veri türünde> kullanılan yapılandırılmış kullanıcı tanımlı türler, tablo türünün tanımlandığı veritabanı şeması kapsamının bir parçasıdır. Veritabanı içinde farklı bir kapsamdaki yapılandırılmış kullanıcı tanımlı türlere erişmek için iki bölümlü adlar kullanın.
Kullanıcı tanımlı tablo türlerinde, hesaplanan sütunlardaki birincil anahtar ve PERSISTEDolmalıdırNOT NULL.
Doku SQL veritabanında kullanıcı tanımlı türler oluşturulabilir ancak Fabric OneLake ile yansıtılmaz ve kullanıcı tanımlı türlerdeki sütunlar yansıtmada atlanır.
Bellek için iyileştirilmiş tablo türleri
SQL Server 2014'te (12.x) başlayarak, bir tablo türündeki verileri işleme işlemi diskte değil birincil bellekte yapılabilir. Daha fazla bilgi için bkz. OLTP'ye genel bakış ve kullanım senaryolarıIn-Memory. Bellek için iyileştirilmiş tablo türlerinin nasıl oluşturulacağını gösteren kod örnekleri için bkz. Memory-Optimized Tablosu ve Yerel Olarak Derlenmiş Saklı Yordam Oluşturma.
Permissions
CREATE TYPE Geçerli veritabanında izin ve ALTERschema_name üzerinde izin gerektirir.
schema_name belirtilmezse, geçerli kullanıcının şemasını belirlemek için varsayılan ad çözümleme kuralları uygulanır.
assembly_name belirtilirse, kullanıcının derlemeye sahip olması veya üzerinde izni olması REFERENCES gerekir.
Deyimindeki CREATE TABLE herhangi bir sütun kullanıcı tanımlı türde olacak şekilde tanımlanmışsa, REFERENCES kullanıcı tanımlı tür üzerinde izin gereklidir.
Kullanıcı tanımlı tür kullanan bir sütuna sahip bir tablo oluşturan kullanıcının, kullanıcı tanımlı tür üzerinde izni olması gerekir REFERENCES . Bu tablonun içinde tempdbREFERENCES oluşturulması gerekiyorsa, tablo oluşturulmadan önce her seferinde izinlerin açıkça verilmesi veya bu veri türünün ve REFERENCES iznin model veritabanına eklenmesi gerekir. Örneğin:
CREATE TYPE dbo.udt_money FROM varchar(11) NOT NULL;
GO
GRANT REFERENCES ON TYPE::dbo.udt_money TO public
Bu yapılırsa, bu veri türü ve REFERENCES izni kalıcı olarak kullanılabilir tempdb . Aksi takdirde, SQL Server yeniden başlatıldığında kullanıcı tanımlı veri türü ve izinler kaybolur. Daha fazla bilgi için bkz. CREATE TABLE
Her yeni veritabanının modelden bu kullanıcı tanımlı veri türünün tanımını ve izinlerini devralmasını istemiyorsanız, yalnızca tempdb veritabanında uygun izinleri oluşturmak ve atamak için başlangıç saklı yordamını kullanabilirsiniz. Örneğin:
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
Alternatif olarak, geçici tablolar kullanmak yerine, geçici depolama gereksinimleri için kullanıcı tanımlı veri türlerine başvurmanız gerektiğinde tablo değişkenlerini kullanmayı göz önünde bulundurun. Tablo değişkenlerinin kullanıcı tanımlı veri türlerine başvurması için, kullanıcı tanımlı veri türü için açıkça izin vermeniz gerekmez.
Examples
A. Varchar veri türünü temel alan bir diğer ad türü oluşturma
Aşağıdaki örnek, sistem tarafından sağlanan varchar veri türünü temel alan bir diğer ad türü oluşturur.
CREATE TYPE SSN
FROM VARCHAR(11) NOT NULL;
B. Kullanıcı tanımlı tür oluşturma
Şunlar için geçerlidir: SQL Server
Aşağıdaki örnek, derlemesinde Utf8Stringsınıfına utf8string başvuran bir tür utf8string oluşturur. Türü oluşturmadan önce derleme utf8string yerel veritabanına kaydedilir. deyiminin ikili bölümünü CREATE ASSEMBLY geçerli bir açıklamayla değiştirin.
CREATE ASSEMBLY utf8string
AUTHORIZATION [dbi]
FROM 0x4D... ;
GO
CREATE TYPE Utf8String
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string];
GO
C. Kullanıcı tanımlı tablo türü oluşturma
Aşağıdaki örnek, iki sütunu olan kullanıcı tanımlı bir tablo türü oluşturur. Tablo değerli parametreleri oluşturma ve kullanma hakkında daha fazla bilgi için bkz. Table-Valued Parametreleri (Veritabanı Altyapısı) kullanma.
CREATE TYPE LocationTableType AS TABLE (
LocationName VARCHAR(50),
CostRate INT
);
GO
D. Birincil anahtar ve dizin ile kullanıcı tanımlı tablo türü oluşturma
Aşağıdaki örnek, biri () birincil anahtar, diğeri (NamePrice) ise kümelenmemiş bir dizine sahip olmak üzere üç sütunu olan kullanıcı tanımlı bir tablo türü oluşturur. Tablo değerli parametreleri oluşturma ve kullanma hakkında daha fazla bilgi için bkz. Table-Valued Parametreleri (Veritabanı Altyapısı) kullanma.
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