2014-08-30 12 views

Antwort

16

Es gibt keine verallgemeinerte Methode, um benutzerdefinierte Verbindungszeichenfolgenattribute über Client-APIs zu übergeben und mithilfe von T-SQL abzurufen. Sie haben jedoch eine Reihe von Alternativen. Unten sind ein paar.

Methode 1: Das Anwendungsname Schlüsselwort in der Verbindungszeichenfolge verwenden zu 128 Zeichen verzichten und Abrufen von mit dem APP_NAME() T-SQL-Funktion:

Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DB;Data Source=SERVER;Application Name="SomeAttr=SomeValue" 

SELECT APP_NAME(); 

Hinweis, dass diese zu 128 begrenzt sind Zeichen und Sie müssen die Nutzlast analysieren. Da ADO.NET außerdem einen separaten Verbindungspool für jede einzelne Verbindungszeichenfolge erstellt, sollten Sie berücksichtigen, dass es praktisch kein oder nur wenig Datenbankverbindungs-Pooling geben wird.

Methode 2: Ausführen einer nach dem SET CONTEXT_INFO verbinden, und weisen zu 128 Bytes bis die mit dem CONTEXT_INFO) T-SQL-Funktion retreived werden können:

DECLARE @context_info varbinary(128) = CAST('SomeAttr=SomeValue' AS varbinary(128)); 
SET CONTEXT_INFO @context_info; 

SELECT CAST(CONTEXT_INFO() AS varchar(128)); 

Hinweis, dass dies auf 128 Bytes begrenzt ist, und Sie müssen die Nutzlast analysieren.

Methode 3: Erstellen Sie eine Sitzungsebene temporäre Tabelle nach Verbindung und Name/Wert-Paare einfügen, die mit einer SELECT-Abfrage abgerufen werden können:

CREATE TABLE #CustomSessionAttributes(
     AttributeName varchar(128) PRIMARY KEY 
    , AttributeValue varchar(1000)); 
INSERT INTO #CustomSessionAttributes VALUES('SomeAttr', 'SomeValue'); 

SELECT AttributeValue 
FROM #CustomSessionAttributes 
WHERE AttributeName = 'SomeAttr'; 

Beachten Sie, dass Sie den Attributwert Größe erhöhen und Geben Sie nach Bedarf ein, und es ist kein Parsen erforderlich.

Methode 4: Erstellen Sie eine permanente Tabelle mit Session-ID eingegeben und Attributnamen, Name/Wert-Paare danach mit einem SELECT-Abfrage abgerufen werden verbinden einfügen können:

CREATE TABLE dbo.CustomSessionAttributes(
     SessionID smallint 
    , AttributeName varchar(128) 
    , AttributeValue varchar(1000) 
    , CONSTRAINT PK_CustomSessionAttributes PRIMARY KEY (SessionID, AttributeName) 
    ); 
--clean up previous session 
DELETE FROM dbo.CustomSessionAttributes WHERE SessionID = @@SPID; 
--insert values for this session 
INSERT INTO dbo.CustomSessionAttributes VALUES(@@SPID, 'SomeAttr', 'SomeValue'); 

--retreive attribute value 
SELECT AttributeValue 
FROM dbo.CustomSessionAttributes 
WHERE 
    SessionID = @@SPID 
    AND AttributeName = 'SomeAttr'; 

Beachten Sie, dass sich der Anstieg Größe und Typ des Attributs je nach Bedarf zuweisen und keine Analyse erforderlich.

EDIT:

Methode 5: Verwendung gespeicherte Prozedur sp_set_session_context zum Speichern sitzungs scoped Name/Wert-Paare und die Werte mit der Funktion SESSION_CONTEXT() abzurufen. Diese Funktion wurde in SQL Server 2016 und Azure SQL-Datenbank eingeführt.

EXEC sp_set_session_context 'SomeAttr', 'SomeValue'; 
SELECT SESSION_CONTEXT(N'SomeAttr'); 
Verwandte Themen