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:

  1. Yeni oluşturmak veritabanı de proje Visual Basic veya Visual C# dil düğüm.

  2. Başvuru Ekle SQL Serverudt içeren veritabanı.

  3. Eklemek a Kullanıcı tanımlı türü sınıfı.

  4. udt uygulamak için kod yazabilir.

  5. 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.

Ayrıca bkz.

Kavramlar

clr kullanıcı tanımlı türler