SQL-Registry-Prozeduren #
Die SQL-Registry wird über eine Reihe von Stored Procedures verwaltet. Alle Prozeduren tragen das Präfix cn_Reg. Sie ermöglichen das Erstellen, Lesen, Schreiben und Löschen von Schlüsseln und Werten in der hierarchischen Registry-Struktur.
Eine Übersicht der Registry-Struktur findet sich unter SQL-Registry.
Schlüsselverwaltung #
cn_RegCreateKey #
Erstellt einen neuen Schlüssel unter einem vorhandenen Elternschlüssel.
EXEC cn_RegCreateKey
@basekeyid = int, -- ID des Elternschlüssels
@name = nvarchar(200), -- Name des neuen Schlüssels
@newkeyid = int OUT -- ID des erzeugten Schlüssels
cn_RegOpenPath #
Öffnet einen Schlüssel über seinen Pfad. Optional wird der Pfad angelegt, falls er nicht existiert.
EXEC cn_RegOpenPath
@basekeyid = int, -- Basis-Schlüssel-ID (0 = ROOT)
@path = nvarchar(max), -- Pfad (z.B. '\MODULES\Datev')
@keyid = int OUT, -- ID des gefundenen/erzeugten Schlüssels
@CanCreate = int, -- 0 = nur öffnen, 1 = bei Bedarf anlegen
@rootkeyid = int -- Optionaler Root-Key (Standard: NULL)
Beispiel: Schlüssel öffnen oder anlegen #
DECLARE @keyid int
-- Nur öffnen (Fehler wenn nicht vorhanden)
EXEC cn_RegOpenPath 0, '\MODULES\Grundwerte\Xfacture', @keyid OUT, 0
-- Öffnen oder anlegen
EXEC cn_RegOpenPath 0, '\VENDOR\MeinPlugin\Settings', @keyid OUT, 1
cn_RegDelKey #
Löscht einen Schlüssel und rekursiv alle Unterschlüssel und Werte.
EXEC cn_RegDelKey
@keyid = int -- ID des zu löschenden Schlüssels
Rückgabewert: 0 = Erfolg, 1 = Schlüssel existiert nicht
cn_RegKeyExists #
Prüft, ob ein Schlüssel unter einem Elternschlüssel existiert.
EXEC cn_RegKeyExists
@BaseKeyId = int, -- ID des Elternschlüssels
@KeyName = nvarchar(200), -- Gesuchter Schlüsselname
@KeyId = int OUT -- ID des gefundenen Schlüssels (NULL wenn nicht vorhanden)
Rückgabewert: 0 = existiert, 1 = nicht gefunden
cn_RegKeyRename #
Benennt einen Schlüssel um.
EXEC cn_RegKeyRename
@basekeyid = int, -- ID des Elternschlüssels
@oldname = nvarchar(200), -- Alter Name
@newname = nvarchar(200) -- Neuer Name
Rückgabewert: 0 = Erfolg, 1 = alter Name nicht gefunden, 2 = neuer Name existiert bereits
cn_RegCopyKey #
Kopiert einen Schlüssel mit allen Unterschlüsseln und Werten an eine neue Position.
EXEC cn_RegCopyKey
@SourceKeyId = int, -- Quell-Schlüssel-ID
@TargetKeyId = int -- Ziel-Elternschlüssel-ID
cn_RegKeyInfo #
Liefert Metadaten zu einem Schlüssel.
EXEC cn_RegKeyInfo
@BaseKeyId = int, -- Elternschlüssel-ID
@KeyName = nvarchar(200), -- Schlüsselname
@KeyId = int OUT, -- Schlüssel-ID
@HasSubKeys = tinyint OUT, -- Hat Unterschlüssel?
@HasValues = tinyint OUT, -- Hat Werte?
@Timestamp = timestamp OUT -- Zeitstempel
Rückgabewert: 0 = gefunden, 1 = nicht gefunden
Werte lesen #
cn_RegReadString #
Liest einen Zeichenketten-Wert über den Pfad. Dies ist die am häufigsten verwendete Lese-Prozedur.
EXEC cn_RegReadString
@path = nvarchar(max), -- Registry-Pfad
@valuename = nvarchar(200), -- Name des Werts
@value = nvarchar(max) OUT -- Gelesener Wert
Beispiel: Konfiguration lesen #
-- Datev-Ausgabeordner lesen
DECLARE @folder nvarchar(max)
EXEC cn_RegReadString '\MODULES\Datev', 'AusgabeOrdner', @folder OUT
SELECT @folder
-- E-Mail-Provider ermitteln
DECLARE @provider nvarchar(max)
EXEC cn_RegReadString '\SYSTEM\Devices\EMail', 'Provider', @provider OUT
SELECT @provider
cn_RegReadInt #
Liest einen Ganzzahl-Wert.
EXEC cn_RegReadInt
@path = nvarchar(max), -- Registry-Pfad
@valuename = nvarchar(200), -- Name des Werts
@value = int OUT -- Gelesener Wert
Rückgabewert: 0 = Erfolg, -1 = Pfad nicht gefunden, -2 = Wert nicht gefunden, -3 = Werttyp ist nicht INT
cn_RegReadBlobById #
Liest Binärdaten über die Registry-ID (z.B. eingebettete Dateien, verschlüsselte Skripte).
EXEC cn_RegReadBlobById
@id = int, -- Registry-Eintrags-ID
@stamp = binary(8) OUT, -- Zeitstempel
@UseUtf16 = bit -- 0 = ANSI (Standard), 1 = UTF-16
Rückgabewert: 0 = Erfolg, -1 = Eintrag nicht gefunden
cn_RegBulkRead #
Liest alle Werte eines Schlüssels und seiner Unterschlüssel in einem Aufruf. Optimiert für den EULANDA-Start, um die Anzahl der Datenbankabfragen zu minimieren.
EXEC cn_RegBulkRead
@basekeyid = int, -- Basis-Schlüssel-ID
@options = int, -- Optionen
@UseUtf16 = bit -- 0 = ANSI (Standard), 1 = UTF-16
Werte schreiben #
cn_RegWriteString #
Schreibt einen Zeichenketten-Wert. Der Pfad wird bei Bedarf angelegt.
EXEC cn_RegWriteString
@path = nvarchar(max), -- Registry-Pfad
@valuename = nvarchar(200), -- Name des Werts
@value = nvarchar(max) -- Zu schreibender Wert
Rückgabewert: -1 wenn der Pfad nicht geöffnet werden konnte
Beispiel: Konfiguration schreiben #
-- Plugin-Version speichern
EXEC cn_RegWriteString '\VENDOR\MeinPlugin', 'Version', '2.0'
-- Modul-Einstellung setzen
EXEC cn_RegWriteString '\MODULES\Grundwerte\MeinModul', 'Aktiv', '1'
cn_RegWriteTextValue #
Schreibt einen Text-Wert über die Schlüssel-ID (für mehrzeilige Texte).
EXEC cn_RegWriteTextValue
@basekeyid = int, -- Schlüssel-ID
@valuename = nvarchar(200), -- Name des Werts
@value = nvarchar(max), -- Text-Wert
@options = int -- Optionen
cn_RegWriteValue #
Allgemeine Schreib-Prozedur mit Typangabe. Wird intern von den spezialisierten Prozeduren verwendet.
EXEC cn_RegWriteValue
@basekeyid = int, -- Schlüssel-ID
@valuename = nvarchar(200), -- Name des Werts
@ValueType = tinyint, -- Werttyp (2=String, 3=Int, 4=Text, 5=Float, 6=Binary)
@data = varbinary(max), -- Binäre Darstellung des Werts
@Options = int -- Optionen (Standard: NULL)
cn_RegWriteBlobValue #
Schreibt Binärdaten (z.B. eingebettete Dateien, Bilder).
EXEC cn_RegWriteBlobValue
@basekeyid = int, -- Schlüssel-ID
@valuename = nvarchar(200), -- Name des Werts
@value = varbinary(max), -- Binärdaten
@options = int -- Optionen
Werte verwalten #
cn_RegValueExists #
Prüft, ob ein Wert unter einem Schlüssel existiert.
EXEC cn_RegValueExists
@BaseKeyId = int, -- Schlüssel-ID
@ValueName = nvarchar(200), -- Gesuchter Wertname
@ValueId = int OUT -- ID des gefundenen Werts
Rückgabewert: 0 = existiert, 1 = nicht gefunden
cn_RegValueDelete #
Löscht einen einzelnen Wert.
EXEC cn_RegValueDelete
@basekeyid = int, -- Schlüssel-ID
@valuename = nvarchar(200) -- Name des zu löschenden Werts
cn_RegValueRename #
Benennt einen Wert um.
EXEC cn_RegValueRename
@basekeyid = int, -- Schlüssel-ID
@oldname = nvarchar(200), -- Alter Name
@newname = nvarchar(200) -- Neuer Name
Rückgabewert: 0 = Erfolg, 1 = alter Name nicht gefunden, 2 = neuer Name existiert bereits
cn_RegValueInfo #
Liefert Metadaten und Daten eines Werts.
EXEC cn_RegValueInfo
@BaseKeyId = int, -- Schlüssel-ID
@ValueName = nvarchar(200), -- Wertname
@Options = int, -- Optionen
@ValueId = int OUT, -- Wert-ID
@ValueType = int OUT, -- Werttyp
@DataSize = int OUT, -- Datengröße in Bytes
@Data = varbinary(8000) OUT, -- Daten (max. 8000 Bytes)
@UseUtf16 = bit -- 0 = ANSI, 1 = UTF-16
cn_RegCopyValues #
Kopiert alle Werte von einem Schlüssel zu einem anderen.
EXEC cn_RegCopyValues
@SourceKeyId = int, -- Quell-Schlüssel-ID
@TargetKeyId = int -- Ziel-Schlüssel-ID
Navigation und Abfrage #
cn_RegSubKeys #
Listet rekursiv alle Unterschlüssel in einer temporären Tabelle #subkeys auf.
-- Temporäre Tabelle muss vorher existieren
DECLARE @level int
EXEC cn_RegSubKeys
@rootid = int, -- Startschlüssel-ID
@level = int OUT -- Verschachtelungstiefe
cn_RegKeyNames #
Liefert die Namen aller direkten Unterschlüssel.
EXEC cn_RegKeyNames
@baseKeyId = int, -- Elternschlüssel-ID
@Options = int, -- 0 = Resultset, andere = konkateniert
@Delimiter = nvarchar(100), -- Trennzeichen bei Konkatenierung
@KeyNames = nvarchar(max) OUT, -- Konkatenierte Namen
@KeyCount = int OUT -- Anzahl der Schlüssel
cn_RegValueNames #
Liefert die Namen aller Werte eines Schlüssels.
EXEC cn_RegValueNames
@baseKeyId = int, -- Schlüssel-ID
@Options = int, -- 0 = Resultset, andere = konkateniert
@Delimiter = nvarchar(100), -- Trennzeichen bei Konkatenierung
@ValueNames = nvarchar(max) OUT, -- Konkatenierte Namen
@ValueCount = int OUT -- Anzahl der Werte
cn_RegShowPath #
Gibt den vollständigen Pfad eines Registry-Eintrags über PRINT aus. Nützlich zum Debuggen.
EXEC cn_RegShowPath
@id = int -- Registry-Eintrags-ID
cn_RegList #
Listet die gesamte Registry-Baumstruktur mit Einrückung auf.
EXEC cn_RegList
@maxindent = int -- Maximale Tiefe (NULL = unbegrenzt)
Beispiel: Registry-Baum anzeigen #
-- Erste drei Ebenen anzeigen
EXEC cn_RegList @maxindent = 3
cn_RegGetVersion #
Liefert die Version des Registry-Subsystems.
EXEC cn_RegGetVersion
@VersionMajor = tinyint OUT, -- Hauptversion (aktuell: 2)
@VersionMinor = tinyint OUT -- Nebenversion (aktuell: 0)
Die Version 2.0 unterstützt NVARCHAR für Namen und Werte (Unicode).
cn_RegSpecialKey #
Öffnet einen vordefinierten Spezialschlüssel über seinen Typ oder Namen.
EXEC cn_RegSpecialKey
@KeyType = int, -- Numerischer Schlüsseltyp
@KeyTypeName = varchar(50), -- Oder: Name (z.B. 'DEFAULT_USER')
@AccessID = int, -- Optionale Zugriffs-ID
@Qualifier1 = nvarchar(200), -- Optionaler Qualifier
@Qualifier2 = nvarchar(200), -- Optionaler Qualifier
@KeyId = int OUT, -- Gefundene Schlüssel-ID
@CanCreate = int -- 0 = nur öffnen, 1 = anlegen
Praxisbeispiel: Plugin-Konfiguration #
Das folgende Beispiel zeigt den typischen Ablauf beim Zugriff auf die SQL-Registry – hier am Beispiel des Xfacture-Plugins für elektronische Rechnungen:
-- 1. Prüfen ob das Plugin installiert ist
DECLARE @keyid int
EXEC cn_RegOpenPath NULL, '\VENDOR\ESOL\MODULES\DMS', @keyid OUT, 0, 0
IF @keyid IS NULL
PRINT 'DMS-Modul nicht installiert'
-- 2. Konfiguration lesen
DECLARE @format nvarchar(max), @email nvarchar(max)
EXEC cn_RegReadString '\MODULES\Grundwerte\Xfacture', 'Format', @format OUT
EXEC cn_RegReadString '\MODULES\Grundwerte\Xfacture', 'EMail', @email OUT
SELECT @format AS Format, @email AS EMail
-- 3. E-Mail-Provider ermitteln
DECLARE @provider nvarchar(max)
EXEC cn_RegReadString '\SYSTEM\Devices\EMail', 'Provider', @provider OUT
-- 4. Eigene Einstellung speichern
EXEC cn_RegWriteString '\VENDOR\MeinPlugin', 'LetzterExport', CONVERT(varchar, GETDATE(), 126)
Siehe auch #
- SQL-Registry – Aufbau und Struktur der Registry
- DATAOBJECTS / Actions – Menübefehle über die Registry definieren
- Plugins – Plugin-Registrierung