2009-03-18 11 views
17

Sind benutzerdefinierte Datentypen in SQL Server etwas, das ein SQL-Zwischenbenutzer kennen und verwenden sollte?Wie cool sind benutzerdefinierte Datentypen in SQL Server?

Was sind die Vor- und Nachteile der Verwendung von UDTs?

+0

manuelle Ansatz aber nützlich mein Leben gerettet: Referenz Link: http://stackoverflow.com/questions/1383494/alter-user-defined-type-in-sql-server –

Antwort

16

Niemals benutzen sie ist mein Rat. Sie sind in einer Welt der Verletzung, wenn Sie jemals die Definition ändern müssen. Vielleicht hat sich das seit SQL Server 2000 verbessert und jemand mit mehr Vertrautheit mit den neueren Versionen kann Ihnen sagen, ob es jetzt sicher ist, ins Wasser zu kommen, aber bis ich eine Bestätigung davon hatte und es selbst mit einem Test überprüft hatte, würde ich nicht Setze es nicht in mein Produktionssystem.

Schauen Sie sich diese Frage für Details: How to change the base type of a UDT in Sql Server 2005?

+4

ich verwendet habe, sie seit 2000 und hatte nie irgendwelche Probleme. Ich habe einige von ihnen geändert ... Ich benutze sie regelmäßig für Typen, die benutzerdefinierte Validierung oder Einschränkungen (benutzerdefinierte Uuids, etc.) benötigen. Ich empfehle sie sehr für diesen Zweck, besonders wenn Sie ein System zu einem Framework aufbauen. Wer eine Decke benutzt, benutzt sie nicht, ist fast immer wong, egal welches Feature es ist. – Dawesi

13

ich nicht Verwendung codebasierte UDTs, weil ich glaube nicht, dass die zusätzliche Komplexität, die Vorteile garantiert. I tun verwenden Sie T-SQL UDTs, weil es sehr wenig zusätzliche Komplexität gibt, so dass die Vorteile den Aufwand wert sind. (Dank Marc_s gehen für den Hinweis auf, dass meine ursprüngliche Post war unvollständig!)

Bezug auf die Codebasis UDTs

Betrachten Sie es so: Wenn Ihr Projekt hat einen verwalteten Code-Komponente (App) und eine Datenbankkomponente (SQL Server) Welchen wirklichen Vorteil haben Sie durch die Definition von verwaltetem Code in der Datenbank? Durch meine Erfahrung? Keiner.

Die Bereitstellung ist schwieriger, da Sie Assemblys zu Ihrer DB-Bereitstellung hinzufügen und diese Assemblys ändern, Dateien usw. in SQL Server hinzufügen müssen. Sie müssen auch die CLR in SQL Server einschalten (keine große Sache, aber niemand hat mir bewiesen, dass dies keine Performance-/Speicher-Strafe haben wird). Am Ende haben Sie genau das, was Sie gehabt hätten, wenn Sie dies einfach in den Code Ihrer Anwendung umgesetzt hätten. Es mag eine gewisse Leistungsverbesserung geben, aber es scheint mir wirklich eine verfrühte Optimierung zu sein - vor allem, da ich nicht weiß, ob die Performance leidet, weil die CLR ein- oder ausgeschaltet ist.

Hinweis: Ich nehme an, dass Sie die CLR von SQL Server verwenden würden, um Ihre Typen zu definieren. HLGEM spricht über SQL Server 2000, aber ich bin nicht vertraut mit 2000 und dachte, es hätte nur UDFs und nicht UDTs in extern definierten DLLs (aber zitieren Sie mich nicht ... Ich bin wirklich nicht vertraut damit!).

In Bezug T-SQL UDTs

T_SQL UDTs können allein in SQL definiert werden (gehen Sie zu "Programmierbarkeit | Typen | Benutzerdefinierte Datentypen" in SQL Server Management Studio). Für Standard-UDTs würde ich in der Tat empfehlen, dass Sie sie beherrschen. Sie sind recht einfach und können Ihre DDL selbstdokumentierender machen und Integritätsbedingungen erzwingen. Zum Beispiel definiere ich einen "GenderType" (char (1), nicht nullbar, mit "M" oder "F"), der sicherstellt, dass nur geeignete Daten im Gender-Feld erlaubt sind.

UDTs sind insgesamt ziemlich einfach, aber this article gibt ein ziemlich gutes Beispiel dafür, wie man es auf die nächste Ebene bringt, indem man eine Regel definiert, um die erlaubten Daten in Ihrem UDT einzuschränken.

Als ich diese Frage ursprünglich beantwortete, war ich auf die Idee von komplexen, Code-definierten Typen (schmatzt Handfläche auf Stirn) fixiert. Also ... danke Marc.

+2

UDT (benutzerdefinierter Typ) bedeutet nicht unbedingt "verwalteten Code". Sie können einen direkten T-SQL-basierten UDT definieren und verwenden. CREAET TYPE ZipCode FROM varchar (10) NICHT NULL; Nicht zu sagen, es ist großartig und empfohlen - aber es ist nicht unbedingt verwalteten Code .... –

6

Der Profi von benutzerdefinierten Typen ist addressed quite well von Alex Papadimoulis. Die Nachteile wurden hier gut dargelegt.

Ich möchte auch darauf hinweisen, dass die sp_bindrule Funktion veraltet ist, wie von Alex Post festgestellt. Ich bin mir nicht sicher, wann es veraltet war, aber es ist jetzt. In der Tat sind Regeln als Ganzes veraltet.

Wenn ich einen Typ mit einer Einschränkung erstellen möchte, würde ich einen benutzerdefinierten Tabellentyp mit einer Check-Einschränkung für die entsprechende (n) Spalte (n) in Erwägung ziehen. Dies gibt mir auch die Möglichkeit, einen komplexen Datentyp zu erstellen.

+0

Meine Hauptverwendung von ihnen ist, wie Alex beschrieben (bessere Einschränkungen) – Dawesi

0

Ich kann die Verwendung von sql-implementation spezifischen Funktionen nicht wirklich empfehlen, die es schwieriger machen, wenn Sie aus mssql herauswachsen und zu einem anderen dbms migrieren. Für unsere dwh dbs starteten wir auf mssql, migrierten nach oracle und haben seit letztem Jahr graduierte auf hp vertica.

0

Persönlich, in der .Net-Welt ist SQL Server die Katze miauen meiner Meinung nach. Visual Studio verfügt über ein SLEW mit Tools, die in SQL Server integriert sind. Sie können Abfragen direkt aus der VS2013-IDE ausführen, Tabellen erstellen usw. Sie können auch ein SQL Server-Datenbankprojekt in VS2013 erstellen, um die gesamte Datenbank zu verwalten und Publishing auf dev-/production-Servern zu veröffentlichen, was ein Traum für eine Datenbank ist, an der mehrere Entwickler arbeiten, da Sie die Datenbank in die Quelle einchecken können Steuerung.

Ich denke, in C#, auf Windows/Windows Server und nicht mit SQL Server ist ein Produktivitäts-/Leistungsverlust.

Als solche denke ich, es ist verrückt, nicht UDT und UDF-Funktionen zu nutzen. Sie sind absolut großartig und haben mir erlaubt, einige coole Dinge zu tun.

z. Ich habe einen WebSocket Server, der Verbindungen von HTML 5 von WebSocket Clients aufrechterhält, und ich habe USer Defined Functions in sql, so dass meine Table Updates/Delete/Inserts verbundene Clients über Änderungen benachrichtigen können.

Ich habe auch einen UserDefinedType, der automatisch Grabbing-Dateien von der Datenbank verwaltet.

z. Wir haben eine Tabelle mit Binärdateien mit einer FileID, FileName usw. Dann habe ich eine UDT, die ich für andere Tabellen verwenden kann, um auf die Dateien zu verweisen. Das UDT verfügt über Methoden zum Abrufen der Dateien aus der SQL-Tabelle und zum Zwischenspeichern.

z. Wenn die zwischengespeicherte Datei des UDT (auf dem Datenträger) mit der Version in der Datenzeile synchronisiert ist, lädt sie die Datei aus dem Cache, andernfalls führt sie eine SQL-Operation zum Abrufen der Datei aus und speichert sie dann für das nächste Mal, wenn sie angefordert wird . Der Cache ist konfigurierbar und verbraucht X Speicherplatz und behält die zuletzt aufgerufenen Dateien im Cache. Z.B. Wenn der Cache voll ist, löscht er die ältesten zwischengespeicherten Dateien, um Platz für neue zu schaffen. Unser Cache befindet sich ebenfalls auf einer SSD.

+1

Sorry, denken Sie, dass Sie zwischen benutzerdefinierten Typen und benutzerdefinierten Funktionen durcheinander geraten sowie zwischen SQL und OOP im Allgemeinen. SQL-benutzerdefinierte Typen haben keine Methoden und können nichts automatisch "verwalten". Sie werden erstellt, wenn das SQL Server-Datenbankmodul die DDL-Anweisung CREATE TYPE ausführt und möglicherweise nicht auf CLR-Assemblys basiert (obwohl ich denke, dass sie immer als CLR-Typen im Hintergrund implementiert sind). – DaveBoltman

Verwandte Themen