Name der aktuellen Prozedur ermitteln – @@PROCID

Die Systemvariable @@PROCID enthält die Objekt-ID einer aktuellen Gespeicherten Prozedur, einer Funktion oder eines Triggers.

Ein kleines Beispiel soll dies verdeutlichen.
Dazu ist zunächst im SQL Server Management Studio folgende Gespeicherte Prozedur anzulegen.

CREATE PROC pWerWars
AS
SET NOCOUNT ON;

DECLARE @Meldung nvarchar(1000);

SET @Meldung = N’Dieses Ergebnis wurde Ihnen präsentiert von der Prozedur ‚ +  Object_Name(@@PROCID)

SELECT @Meldung as  Hinweis;

Die Funktion Object_Name ermittelt anhand des Werts der Systemvariable @@PROCID den Namen der Prozedur.

Führt man die Gespeicherte Prozedur mittels EXEC pWerWars aus, erhält man folgendes Ergebnis:

Applikationsname per T-SQL ermitteln – APP_NAME()

Die Funktion APP_NAME() liefert den Namen der Applikation, die das SQL Server-Objekt bzw. die SQL-Anweisung ausführt.

Bei der Eingabe von

SELECT APP_NAME()

im SQL Server Management Studio erhält man folgendes Ergebnis:

Eine Pass Through-Abfrage in Access mit der gleichen Anweisung liefert

Alphanumerische Spalten einer Tabelle

Hier eine kleine Abfrage zur Ermittlung der alphanumerischen Spalten einer Tabelle:

SELECT             o.name As Tabelle, c.name As Spalte, c.column_id As Reihenfolge
FROM
                    sys.columns c INNER JOIN sys.objects o ON c.object_id = o.object_id
                                    INNER JOIN sys.types t ON c.system_type_id = t.system_type_id
WHERE
               o.type = ‚u‘ And t.collation_name Is Not Null
GROUP BY   o.name, c.name, c.column_id
ORDER BY
   o.name, c.column_id

Wie allgemein üblich, übernehme auch ich selbstverständlich keinerlei Haftung für diesen Code.

SELECT-Statement mit variablem Tabellennamen

Frage:
In einer SELECT-Anweisung soll der Tabellenname durch eine lokale Variable ersetzt werden.

Lösung:
In SQL-Anweisungen lassen Variablen sich zwar in Ausdrücken, nicht aber anstelle von Objektnamen oder Schlüsselwörtern verwenden.
Um den Tabellennamen in einer SQL-Anweisung erst bei der Ausführung zu ersetzen, muss mit dynamischem SQL gearbeitet werden.
Dazu wird das SQL-Statement bei der Ausführung zu einem String zusammengesetzt und mit Execute oder sp_executesql ausgeführt.

Zum Thema „Dynamisches SQL“ hat Frank Kalis den interessanten Artikel „Dynamisches SQL – Fluch und Segen“ bereitgestellt.

/* übernommen aus der Original sqlfaq.de */

RAISERROR

Frage:
Trotz Auslösen eines RAISERROR mit Schweregrad 16 wird die Gespeicherte Prozedur nicht fehlerhaft beendet.

Lösung:
Der Schweregrad 16 beendet eine
Gespeicherte Prozedur nur dann, wenn auch wirklich ein Fehler eingetreten ist.
RAISERROR löst keinen Fehler aus, sondern belegt lediglich den @@ERROR-Wert mit der angegebenen Fehlernummer.

Folgendes Skript soll das Verhalten von RAISERROR verdeutlichen:

PRINT @@ERROR
RAISERROR (‚Es ist nix passiert!‘, 16, 1)
IF @@ERROR = 0 PRINT ‚Es ist wirklich nix passiert!‘

— oder mit sp_addmessage

PRINT @@ERROR
EXEC sp_addmessage 50001, 16, N’Es ist nix passiert!‘, ‚us_english‘
RAISERROR (50001, 16, 1)
IF @@ERROR = 0
PRINT ‚Es ist wirklich nix passiert!‘
ELSE
PRINT ‚So richtig ist immer noch nix passiert, aber es hat eine Fehlernummer!‘
EXEC sp_dropmessage 50001, ‚us_english‘
GO

/* übernommen aus der Original sqlfaq.de */

Registry auslesen

Frage:
Per T-SQL sollen Werte aus der Registry gelesen werden.

Lösung:
Es gibt eine undokumentierte Gespeicherte Prozedur in der Datenbank master namens dbo.xp_regread mit den Parametern Rootkey, Path und Value.
Hier ein kleines Beispiel:

DECLARE @bla varchar(10)
exec master.dbo.xp_regread @rootkey=’HKEY_LOCAL_MACHINE‘, @key=’SOFTWARE\…..‘, @value_name=’wert‘, @inhalt=@inhalt OUTPUT

/* übernommen aus der Original sqlfaq.de */