Aracılığıyla paylaş


SQL Server'da kullanıcı tanımlı türler kaydediliyor

In order to use a user-defined type (UDT) in Microsoft SQL Server, you must register it.Derleme kaydediliyor ve kullanmak istediğiniz veritabanı türü oluşturma, bir UDT kaydediliyor içerir.UDTs tek bir veritabanına kapsamına eklenir ve birden çok veritabanlarında her bir veritabanı ile aynı derleme ve UDT kayıtlı sürece kullanılamaz.UDT derleme kaydedilir ve türü oluşturulan UDT de kullanabilirsiniz. Transact-SQL ve istemci kodu. Daha fazla bilgi için bkz:CLR kullanıcı tanımlı türler.

Visual Studio'nun UDTs dağıtmak için kullanma

Bilgisayarınızı UDT dağıtmak için en kolay yolu kullanarak olur. Microsoft Visual Studio. Ancak, daha karmaşık dağıtım senaryoları ve en yüksek esneklik için kullanın Transact-SQL Bu konuda ileride açıklandığı gibi.

Oluşturma ve Visual Studio'yu kullanarak bir UDT dağıtmak için aşağıdaki adımları izleyin:

  1. Yeni oluşturma Veritabanı projeVisual Basic or Visual C# dil düğümlerin.

  2. Başvuru Ekle SQL Server UDT içeren veritabanıdır.

  3. Ekleme bir kullanıcı tanımlı tür sınıf.

  4. UDT uygulamak için bir kod yazın.

  5. Gelen Oluşturma Seçim menüsündedağıtmak.Bu derleme kaydeder ve bulunan tür oluşturur SQL Server Veritabanı.

Transact-SQL kullanarak UDTs Dağıt

The Transact-SQL CREATE derleme syntax is used to register the derleme in the database in which you wish to use the UDT. Bu dahili veritabanı sistem tablolarında değil dışarıdan dosya sisteminde depolanır.UDT dış birleştirmeler üzerinde bağımlı ise, bunlar çok veritabanına yüklenmiş olması gerekir.CREATE TYPE deyim UDT kullanılacak olduğu veritabanında oluşturmak için kullanılır.Daha fazla bilgi için bkz: derleme (Transact-SQL) CREATE ve TYPE (Transact-SQL) CREATE.

CREATE derleme'ni kullanma

CREATE ASSEMBLY sözdizimi derleme UDT kullanmak istediğiniz veritabanına kaydeder.Bir kez derleme kayıtlı hiç bağımlılığı var.

Aynı birden çok sürümü oluşturma derleme belirli bir veritabanı içinde izin verilmiyor.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.Daha fazla bilgi için bkz: "Oluşturma ve kullanma Strong-Named derlemeler".NET Framework SDK'sındaki.

CREATE ASSEMBLY GÜVENLI veya EXTERNAL_ACCESS izniyle, yürütüldüğünde, derleme denetlenir doğrulanabilen olduğundan emin olun ve yazmak için güvenli ayarlar.Bir izni belirtme atlarsanız küme, GÜVENLI kabul edilir.Güvenli OLMAYAN izinle kod küme yapılmaz.Derleme izin kümeleri hakkında daha fazla bilgi için bkz: Derlemeler tasarlama.

Örnek

Aşağıdaki Transact-SQL deyim noktası derlemede kaydeder. SQL Server içinde AdventureWorks veritabanı, GÜVENLI izinle küme.Derleme, WITH PERMISSION_SET yan tümce girilmediği takdirde, GÜVENLI bir izin kümesi ile kaydedilir.

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

Aşağıdaki Transact-SQL deyim derlemenin kullanarak kaydeder. <assembly_bits> FROM yan tümcesinde bağımsız değişkeni. Bu varbinary değer, dosya bayt akışı temsil eder.

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

CREATE TÜRÜ kullanma

Derleme veritabanına yüklü olduğunda, ardından türünü kullanarak oluşturabileceğiniz Transact-SQL CREATE TYPE deyim. Bu, o veritabanı için kullanılabilen türler listesine türü ekler.Veritabanı kapsam türünde ve türü yalnızca içersinde oluşturulduğu veritabanında kullanılabilir.UDT veritabanında zaten varsa, CREATE TYPE deyim, bir hata ile başarısız olur.

Not

CREATE TÜRÜ sözdizimi, ayrıca yerel oluşturmak için kullanılır SQL Server diğer ad ad veri türleri ve değiştirmek için tasarlanmıştır sp_addtype diğer ad ad veri türleri oluşturma anlamına gelir. Bazı isteğe bağlı bağımsız değişkenler CREATE TYPE sözdiziminde UDTs oluşturmaya başvurun ve diğer ad ad veri türleri (örneğin, temel türü) oluşturmak için uygun değildir.

Not

Ile başlayan SQL Server 2005, üzerinde bir SQL Serveruyumluluk düzey "oluşturamıyor, 80" veritabanı, kullanıcı tanımlı türler, saklı yordamları, işlevleri, toplamları veya Tetikleyicileri yönetiliyor. Bu CLR bütünleştirme özelliklerinin avantajlarından yararlanmak için: SQL Server, kullanmanız gereken sp_dbcmptlevel (Transact-SQL)saklı bir yordam için "100" veritabanı uyumluluk düzeyini ayarlamak için.

Daha fazla bilgi için bkz:TYPE (Transact-SQL) CREATE.

Örnek

Aşağıdaki Transact-SQL deyim oluşturur Point TYPE. Iki bölümü adlandırma sözdizimini kullanarak DıŞ ADı belirtildi AssemblyName.UDTName.

CREATE TYPE dbo.Point 
EXTERNAL NAME Point.[Point];

Bir UDT veritabanından kaldırılıyor.

TYPE DROP deyim bir UDT geçerli veritabanından kaldırır.Bir UDT kesilmeden sonra derleme DROP deyim derlemenin veritabanından silmek için kullanabilirsiniz.

TYPE DROP deyim ile başlamıyor yürütmek aşağıdaki durumlarda:

  • UDT kullanılarak tanımlanmış bir sütun içeren veritabanındaki tabloları.

  • Işlevler, saklı yordamlar veya Tetikleyicileri değişkenler veya parametreler, veritabanında SCHEMABINDING, WITH yan tümce ile oluşturulan UDT,'ı kullanın.

Örnek

Aşağıdaki Transact-SQL aşağıdaki sırayla yürütmelisiniz. Ilk başvuran tablo Point UDT, sonra türü ve son derleme kesilmesine gerekir.

DROP TABLE dbo.Points;
DROP TYPE dbo.Point;
DROP ASSEMBLY Point;

UDT bağımlılıklar bulma

UDT sütun tanımları için tablolar gibi bağımlı nesneleri için varsa, TYPE DROP deyim başarısız olur.Işlevler, saklı yordamlar veya WITH SCHEMABINDING kullanarak bir veritabanı içinde oluşturulmuş olması durumunda da başarısız yan tümce, değişken veya kullanıcı tanımlı tür parametreleri Bu yordamlar kullanın.Tüm bağımlı nesneleri öne alın ve sonra TÜRÜ DROP deyim yürütmek gerekir.

Aşağıdaki Transact-SQL Sorgu, tüm sütunları ve bir UDT, kullandığınız parametreleri bulur AdventureWorks veritabanıdır.

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

Içinde oluşturulduktan sonra bir UDT değiştiremiyor bir SQL Server veritabanı türü temel aldığı derleme değiştirebilirsiniz, ancak. Çoğu durumda, veritabanındaki UDT kaldırmalısınız Transact-SQL TYPE DROP deyim, değişiklik, alttaki derlemeye ve ALTER derleme deyim kullanarak yeniden yükleyin. Daha sonra UDT ve tüm bağımlı nesneleri yeniden oluşturmanız gerekir.

Örnek

Kaynak kodu, UDT derlemede değişiklikler ve bu derlenmiş çekirdekler sonra ALTER derleme deyim kullanılır..Dll dosyası sunucuya kopyalar ve yeni için rebinds derleme.Tam sözdizimi için bkz: ALTER derleme (Transact-SQL).

Aşağıdaki Transact-SQL ALTER derleme deyim, disk üzerindeki belirtilen konum Point.dll derlemesinden yeniden yükler.

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

Kaynak kodu eklemek için ALTER derleme'ni kullanma

ALTER derleme sözdizimi ADD FILE tümcesinde CREATE derleme içinde yok.Kaynak kodu veya bir derlemesi ile ilişkili diğer dosyaları eklemek için kullanabilirsiniz.Dosyaları özgün konumlarına kopyalar ve veritabanındaki sistem tablolarında depolanır.Bu, her zaman kaynak kodu veya diğer dosyaları elde hiçbir zaman yeniden oluşturmak veya geçerli sürüm UDT belgelemek gerekir kullanmanızı sağlar.

Aşağıdaki Transact-SQL ALTER derleme deyim Point.cs sınıfı kaynak kodunu ekler Nokta udt.Bu, Point.cs dosyasında yer alan metni kopyalar ve "PointSource" adı altında bir veritabanında depolar.

ALTER ASSEMBLY Point
ADD FILE FROM '\\Projects\Point\Point.cs' AS PointSource;

Derleme bilgileri depolanan sys.assembly_files derleme yüklü olduğu bir veritabanı tablosunda.The sys.assembly_files tablo contains the following columns.

  • assembly_id
    Derleme için tanımlanan tanımlayıcısı.Bu numara, aynı derlemeye ilgili tüm nesnelere atanır.

  • adı
    Nesnenin adı.

  • file_id
    Ilk nesnesiyle ilişkili olarak, her nesneyi tanımlayan BIR sayı bir verilen assembly_id 1 değeri verilmiş.Birden çok nesneye aynı ile ilişkili olup olmadığını assembly_idve izleyen her file_id değeri 1 artırılır.

  • içeriği
    Dosya veya derleme onaltılı gösterim.

DÖNÜÞTÜRME kullanabilirsiniz veya CONVERT işlev içeriğini dönüştürmek için içeriği sütun okunabilir metne.Aşağıdaki sorgu Point.cs dosyasının içeriği, sonucu kısıtlamak için WHERE yan tümcesini için tek bir satır kümesi adı'nı kullanarak, okunabilir metne dönüştürür.

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 özgün varolan bir boşluk korunur olduğunu görürsünüz.

UDTs ve derlemeler yönetme

Uygulamanız, UDTs planlarken, hangi yöntemleri UDT derlemede gereklidir ve hangi yöntemleri ayrı derlemelerde oluşturulmalı ve kullanıcı tanımlı işlevler uygulanan veya saklı yordamları deneyin.Yöntemleri ayrı derlemeler ayırma UDT bir tablo sütununda depolanabilir verileri etkilemeden kod güncelleştirmenize olanak verir.UDT derlemeler UDT sütunları bırakmadan değiştirmek ve yeni tanım önceki değerleri ve imza türü yalnızca okuyabilir, diğer bağımlı nesnelerin değil değiştirin.

UDT büyük ölçüde uygulamak için gerekli koddan değişebilir yordamsal kod ayırarak bakım kolaylaştırır.Yalnızca için UDT işlev için gerekli olan kodu da dahil olmak üzere, UDT tanımlarınızın basit, tutma UDT kendisi için kod düzeltmeleri veya hata düzeltmelerini veritabanından kesilmesine gerekebilir riskini azaltır.

UDT para birimi ve para birimi dönüştürme işlevinde

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.UDT sınıfı, bir dize ve Tutar para bir kültür adı sunar bir decimal Veri Türü. Tüm gerekli seri hale getirme yöntemleri, sınıfı tanımlayan derleme içinde yer alır.Para birimi dönüştürme bir kültür başka uygulayan işlevi adlı bir dış işlev uygulanır ConvertCurrencyve bu işlev ayrı bir derlemede bulunur.The ConvertCurrency işlev does its work by retrieving the conversion rate from a tablo in the AdventureWorks database.Dönüştürme kurları kaynağını sürekli olarak değiştirmeniz gerekir ya da bulunmalıdır, herhangi bir değişiklik için varolan kodlar derleme kolayca etkilemeden değiştirilebilir Para birimi udt.

Kod için listesini Para birimi UDT ve ConvertCurrency işlevleri, ortak dil çalışma zamanı (CLR) örnekleri yükleyerek bulunabilir.Daha fazla bilgi için bkz:SQL Server Örnekleri ve Örnek Veritabanlarının Yüklenmesiyle İlgili Önemli Noktalar.

Veritabanları arasında UDTs kullanma

Tek bir veritabanı için kapsamlı bir tanım UDTs olarak.Bu nedenle, başka bir veritabanındaki sütun tanımındaki bir veritabanı içinde tanımlanan bir UDT kullanılamaz.Birden çok veritabanlarında UDTs kullanmak için yürütmek aynı derlemeler her bir veritabanını derleme, CREATE ve CREATE TÜR tablolarda.Birleştirmeler, aynı adı, kesin ad, kültür, sürüm, izin kümesi ve ikili içeriği varsa, aynı kabul edilir.

UDT kayıtlı ve her iki veritabanlarındaki erişilebilir olduğunda, kullanılmak üzere başka bir veritabanından UDT değeri dönüştürebilirsiniz.Aynı UDTs boyunca veritabanlarının aşağıdaki senaryolarda kullanılabilir:

  • Arama, farklı bir veritabanında tanımlanmış olan yordamı depolanır.

  • Farklı bir veritabanı içinde tanımlanan tablo sorgulanıyor.

  • Bir veritabanı tablo UDT sütundan UDT veri seçme ve ikinci bir veritabanına aynı bir UDT sütunuyla eklemeden.

Bu durumda, sunucu tarafından gereken herhangi bir dönüştürme otomatik olarak gerçekleşir.Açıkça kullanarak dönüşümleri gerçekleştiremeyebilir olmayan Transact-SQL Işlevler CAST ya da ÇEVIR.

Not UDTs kullanmak için herhangi bir işlem yapmanız gerekmez, SQL Server Database Engine iş tablolar oluşturur tempdb sistem veritabanı.Bu imleçler, Tablo değişkenlerini, işlenmesini içerir ve UDTs ve, saydam olarak içeren kullanıcı tanımlı tablo değerli işlevler olun kullanımı tempdb.Ancak, geçici bir tabloda açıkça oluşturursanız tempdb UDT sütun, sonra da UDT tanımlayan kayıtlı olması gerekirtempdb aynı şekilde bir kullanıcı veritabanı olarak.