SQL Server'da kullanıcı tanımlı türler kaydediliyor
Bir kullanıcı tanımlı türü (udt) kullanmak için Microsoft SQL Server, bunu kayıt gerekir udt kayıt derleme kaydediliyor ve kullanmak istediğiniz veritabanı türü oluşturma içerir. UDTs için tek bir veritabanı kapsamlı ve her veritabanı ile aynı derleme ve udt kayıtlı sürece birden çok veritabanlarında kullanılamaz. udt derleme kayıtlı ve oluşturulan tür udt kullanabilirsiniz bir kez Transact-SQLve istemci kod. Daha fazla bilgi için, bkz. clr kullanıcı tanımlı türler.
UDTs dağıtmak için Visual Studio kullanma
Kullanarak sizin udt dağıtmak için en kolay yol olduğunu MicrosoftVisual Studio. Ancak, daha karmaşık dağıtım senaryoları ve büyük esneklik için kullanın Transact-SQLBu konudaki tartışıldı.
Oluşturma ve Visual Studio'yu kullanarak udt dağıtmak için aşağıdaki adımları izleyin:
Yeni oluşturmak veritabanı de proje Visual Basic veya Visual C# dil düğüm.
Başvuru Ekle SQL Serverudt içeren veritabanı.
Eklemek a Kullanıcı tanımlı türü sınıfı.
udt uygulamak için kod yazabilir.
Dan inşa Seç menüsünden Deploy. Bu derleme kaydeder ve yazın oluşturur SQL Serververitabanı.
UDTs dağıtmak için Transact-sql kullanarak
Transact-SQLcreate assembly sözdizimi udt kullanmak istediğiniz veritabanı derleme kaydı için kullanılır. Bu dahili veritabanı sistem tablolarında değil dışarıdan dosya sisteminde saklanır. udt dış birleştirmeleri bağımlı ise, bunların çok veritabanına yüklenmiş olması gerekir. create type deyimi udt kullanılacak olduğu veritabanında oluşturmak için kullanılır. Daha fazla bilgi için Derleme (Transact-sql) oluşturve CREATE TYPE (Transact-SQL).
create assembly kullanma
create assembly sözdizimi derleme udt kullanmak istediğiniz veritabanına kaydeder. Derleme kayıtlı bir kez hiç bağımlılığı vardır.
Birden çok sürümünü aynı derlemenin verilen bir veritabanı oluşturma izin verilmez. Ancak, birden çok veritabanı Kültür göre aynı derlemenin sürümünü oluşturmak mümkündür. SQL Serverbirden fazla kültür sürümleri derleme örneği içinde kayıtlı gibi farklı isimler tarafından ayıran SQL Server. Daha fazla bilgi için bkz: "Oluşturma ve kullanma Strong-Named derlemeler" İçinde.net Framework sdk.
create assembly güvenli veya external_access izni ile zaman yürütülür, derleme denetlenir doğrulanabilir olduğundan emin olun ve yazın güvenli ayarlar. Bir izin kümesi belirtme atlarsanız, güvenli kabul edilir. Şifre GÜVENSİZ izin kümesi ile işaretlenmemiş. Derleme izin kümeleri hakkında daha fazla bilgi için bkz: Assemblies tasarlama.
Örnek
Aşağıdaki Transact-SQLnoktası Derleme bildirimi kaydeden SQL Serverde AdventureWorks veritabanı, güvenli izin kümesi. PERMISSION_SET ile yan tümcesi atlanırsa, derleme GÜVENLI izin kümesi ile kayıtlıdır.
USE AdventureWorks;
CREATE ASSEMBLY Point
FROM '\\ShareName\Projects\Point\bin\Point.dll'
WITH PERMISSION_SET = SAFE;
USE AdventureWorks;
CREATE ASSEMBLY Point
FROM '\\ShareName\Projects\Point\bin\Point.dll'
WITH PERMISSION_SET = SAFE;
Aşağıdaki Transact-SQLdeyimini kullanarak derleme kaydeden <assembly_bits>argument from yan tümcesinde. Bu varbinarydeğerini temsil eden dosyanın bayt akışı olarak.
USE AdventureWorks;
CREATE ASSEMBLY Point
FROM 0xfeac4 … 21ac78
USE AdventureWorks;
CREATE ASSEMBLY Point
FROM 0xfeac4 … 21ac78
create type kullanma
Bir kez Meclis veritabanına yüklenir, ardından türünü kullanarak oluşturabileceğiniz Transact-SQLcreate type deyimi. Bu veritabanı için kullanılabilir türleri listesi türü ekler. Kapsam türü vardır ve türü yalnızca içinde oluşturulduğu veritabanında kullanılabilir. udt veritabanında zaten create type deyimi hata ile başarısız olur.
[!NOT]
create type sözdizimi da yerli oluşturmak için kullanılan SQL Serverdiğer veri türleri ve değiştirmeye yönelik sp_addtypediğer veri türleri oluşturma aracı olarak. create type sözdizimi isteğe bağlı bağımsız değişkenlerinin UDTs oluşturma için başvurun ve diğer veri türleri (örneğin, taban türü) oluşturmak için geçerli değildir.
Daha fazla bilgi için, bkz. CREATE TYPE (Transact-SQL).
Örnek
Aşağıdaki Transact-SQLdeyimi oluşturur Pointtürü. İki bölümlü adlandırma sözdizimini kullanarak dış adı belirtilen AssemblyName.UDTName.
CREATE TYPE dbo.Point
EXTERNAL NAME Point.[Point];
CREATE TYPE dbo.Point
EXTERNAL NAME Point.[Point];
Veritabanından bir udt kaldırma
type drop deyimi bir udt geçerli veritabanından kaldırır. Bir kez bir udt düştü, veritabanından derleme bırakmak için drop assembly deyimi kullanabilirsiniz.
type drop deyimi aşağıdaki durumlarda yürütmüyor:
Veritabanındaki tabloların udt kullanılarak tanımlanmış sütunlar içeren.
İşlevler, saklı yordamlar veya değişkenler veya parametreler UDT kullanın Tetikleyiciler veritabanında WITH SCHEMABINDING yan tümcesi ile hazırlandı.
Örnek
Aşağıdaki Transact-SQLaşağıdaki sırayla yürütmelisiniz. İlk başvuran tablo Pointudt gerekir düştü, sonra türü ve nihayet Meclis.
DROP TABLE dbo.Points;
DROP TYPE dbo.Point;
DROP ASSEMBLY Point;
DROP TABLE dbo.Points;
DROP TYPE dbo.Point;
DROP ASSEMBLY Point;
udt bağımlılıklar bulma
udt sütun tanımları, tablolar gibi bağımlı nesnelerin varsa type drop deyimi başarısız olur. İşlevler, saklı yordamlar veya Tetikleyiciler Bu yordamlar değişkenler veya parametreler kullanıcı tanımlı türü kullanıyorsanız WITH SCHEMABINDING yan tümcesini kullanarak veritabanında oluşturulan varsa da başarısız olur. Tüm bağımlı nesneleri öne ve type drop deyimi yürütme gerekir.
Aşağıdaki Transact-SQLsorgu tüm sütunları ve bir udt kullanın parametreleri bulur AdventureWorks veritabanı.
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;
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;
UDTs bakımını yapma
Yılında kurulduktan bir udt değiştiremezsiniz bir SQL Serververitabanı türüne dayalı derleme değiştirebilirsiniz, ancak,. Çoğu durumda, veritabanı ile udt kaldırmalısınız Transact-SQLtype drop deyimi, değişiklik için temel derleme ve alter assembly deyimi kullanarak yeniden. Daha sonra udt ve bağımlı nesneleri yeniden oluşturmanız gerekir.
Örnek
Eğer kaynak kodu udt derlemede yapılan değişiklikler ve onu recompiled sonra alter assembly deyimi kullanılır. .Dll dosyasını sunucuya kopyalar ve yeni montaja rebinds. Tam sözdizimini, görmek alter assembly (Transact-sql).
Aşağıdaki Transact-SQLalter assembly deyimi çoğul Point.dll derlemenin diskte belirtilen konumdan.
ALTER ASSEMBLY Point
FROM '\\Projects\Point\bin\Point.dll'
ALTER ASSEMBLY Point
FROM '\\Projects\Point\bin\Point.dll'
Kaynak kodu eklemek için alter assembly kullanma
Dosya Ekle yan tümcesinde alter assembly sözdizimi create ASSEMBLY'de yok. Kaynak kodu veya bir derleme ile ilgili diğer dosyaları eklemek için kullanabilirsiniz. Dosyalar özgün konumlarından kopyalanır ve veritabanındaki sistem tablolarında depolanır. Bu, her zaman kaynak kodunu veya diğer dosyaları yandan hiç yeniden oluşturun veya belgeyi udt sürümü gerekir sağlar.
Aşağıdaki Transact-SQLalter assembly deyimi ekler Point.cs sınıfı kaynak kodu noktası udt. Bu Point.cs dosyasının içerdiği metni kopyalar ve onu "PointSource" adı altında veritabanında depolar.
ALTER ASSEMBLY Point
ADD FILE FROM '\\Projects\Point\Point.cs' AS PointSource;
ALTER ASSEMBLY Point
ADD FILE FROM '\\Projects\Point\Point.cs' AS PointSource;
Derleme bilgileri depolanır sys.assembly_files nerede derleme yüklü veritabanı. Sys.assembly_files tablo aşağıdaki sütunları içerir.
assembly_id
Derleme için tanımlanan tanımlayıcısı. Bu sayı, aynı derlemeye ilişkin tüm nesnelere atanır.name
Nesnenin adı.file_IDfile_idsys.master_files
Her nesneyle ilişkili ilk nesneyi tanımlayan bir numara bir verilen assembly_id değeri 1 verilen varlık. Birden çok nesne, aynı ile ilişkili olup olmadığını assembly_id, sonra daha sonraki file_IDfile_idsys.master_files değeri 1 'er.içerik
Derleme veya dosya onaltılık gösterimi.
cast veya convert işlevinin içeriği dönüştürmek için kullanabileceğiniz içerik okunabilir metin sütunu. Aşağıdaki sorgu sonucu kısıtlamak için where yan tümcesi için tek bir satır ayarlayın adı kullanarak okunabilir metin Point.cs dosyasının içeriğini dönüştürür.
SELECT CAST(content AS varchar(8000))
FROM sys.assembly_files
WHERE name='PointSource';
SELECT CAST(content AS varchar(8000))
FROM sys.assembly_files
WHERE name='PointSource';
Sonuçları bir metin düzenleyicisine kopyalayıp, satır sonları ve orijinal varolan alanlarda korunmuştur görürsünüz.
UDTs ve Assemblies yönetme
UDTs uygulamanızı planlarken, hangi yöntemleri udt derlemede gerekli ve hangi yöntemleri ayrı derlemelerde oluşturulmalı ve kullanıcı tanımlı işlevleri olarak uygulanan veya saklı yordamları düşünün. Yöntemlerin ayrı derlemeler ayıran update kodu udt sütun tablo içinde depolanmış olabilecek verileri etkilemeden sağlar. udt sütunlar bırakmadan udt derlemeler değiştirebilir ve diğer bağımlı nesnelerin yeni tanımı eski değerleri ve imza türü yalnızca okuyabilir zaman değiştirmez.
Büyük ölçüde udt uygulamak için gereken kodu değişebilir yordam kodunu ayıran bakım basitleştirir. İşleve udt için gerekli olan kod dahil ve sizin udt tanım mümkün olduğunca basit tutmak udt kodu düzeltmeler ya da hata düzeltmeleri için veritabanından bırakılan gereken riskini azaltır.
Döviz udt ve para birimi dönüştürme işlevi
Para udt içinde AdventureWorks örnek veritabanı yapısı bir udt ve ilişkili işlevleri için önerilen yol yararlı bir örnek sağlar. Para udt para para sistemi belirli bir kültürün temelinde işlemek için kullanılır ve farklı döviz türleri, dolar, Euro ve benzeri gibi depolama sağlar. udt sınıfı bir kültür adı bir dize ve bir miktar para ortaya çıkarır bir decimalveri türü. Tüm gerekli seri hale getirme yöntemleri sınıfını tanımlama derleme içinde yer alır. Uygulayan bir kültür para birimi dönüştürme işlevi adlı bir dış işlev uygulanan ConvertCurrency, ve bu işlevi ayrı bir derlemede yer almaktadır. ConvertCurrency işlevi bir tablodan dönüşüm oranını alarak çalışmalarını yok AdventureWorks veritabanı. Dönüşüm oranları kaynağı hiç değiştirmeniz gerekir, ya da olması gerektiğini, değişiklikler varolan kodu derleme kolayca etkilemeden değiştirilebilir para udt.
İçin kod para udt ve ConvertCurrency işlevleri, ortak dil çalışma zamanı (clr) örnekler yükleyerek bulunabilir. Daha fazla bilgi için, bkz. Installing Samples.
UDTs veritabanları arasında kullanma
UDTs için tek bir veritabanı kapsamlı tanım gereği vardır. Bu nedenle, bir veritabanında tanımlı udt başka bir veritabanındaki sütun tanımı kullanılamaz. UDTs içinde birden çok veritabanı kullanmak için aynı derlemeler her veritabanında create assembly ve create type deyimleri yürütmek gerekir. Derlemeler aynı adı, güçlü, kültür, sürüm, izin kümesi ve ikili içeriği varsa aynı kabul edilir.
udt kayıtlı ve erişilebilir hem veritabanlarındaki sonra kullanılmak üzere başka bir veritabanından bir udt değer dönüştürebilirsiniz. Aynı UDTs veritabanları aşağıdaki senaryolarda genelinde kullanılabilir:
Arama yordamı tanımlı farklı veritabanlarında depolanır.
Farklı veritabanlarında tanımlanan tabloları Sorgulanıyor.
Bir veritabanı sütununu udt ve ikinci bir veritabanı ile özdeş bir udt sütun ekleme udt veri seçme.
Bu durumlarda sunucu tarafından istenen herhangi bir dönüştürme otomatik olarak gerçekleşir. Sen are değil güçlü-e doğru açıkça kullanarak dönüşümleri gerçekleştirmek Transact-SQLcast veya convert işlevleri.
Not UDTs kullanarak herhangi bir işlem yapması gerekmez zaman SQL Server Veritabanı Altyapısıİş tabloları oluşturur tempdb veritabanı. Bu işleme imleçler, tablo değişkenlerini içerir ve UDTs ve bu şeffaf içeren kullanıcı tanımlı tablo değerli işlevler olun kullanmak tempdb. Ancak, eğer açıkça geçici bir tablo oluşturmak tempdb udt sütun tanımlayan, sonra udt kayıtlı olmalıdır tempdb bir kullanıcı veritabanı olarak aynı şekilde.