2014-08-30 13 views
10

Chcę dodać kilka niestandardowych atrybutów w ciągu połączenia SQLSERVER, coś takiego:Jak dodać atrybuty niestandardowe do ciągu połączenia SQL?

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

a następnie uzyskać ten atrybut w SQL. na przykład SELECT SOME_FUNCTION('SomeAttr')

Odpowiedz

16

Brak uogólnionej metody przekazywania niestandardowych atrybutów ciągów połączenia za pośrednictwem interfejsów API klienta i pobierania za pomocą T-SQL. Masz jednak kilka alternatyw. Poniżej znajduje się kilka.

Metoda 1: Użyj słowa kluczowego nazwa aplikacji w ciągu połączenia, aby przejść do 128 znaków i pobierać z APP_NAME() funkcji T-SQL:

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

SELECT APP_NAME(); 

Zauważ, że jest ograniczona do 128 znaków i będziesz musiał przeanalizować ładunek. Ponadto, ponieważ ADO.NET tworzy oddzielną pulę połączeń dla każdego odrębnego ciągu połączenia, należy wziąć pod uwagę, że efektywnie będzie mało lub nie będzie puli połączeń bazy danych.

Metoda 2: Wykonanie SET CONTEXT_INFO po podłączeniu i przypisać do 128 bajtów, które mogą być retreived z funkcją CONTEXT_INFO) T-SQL:

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

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

Zauważ, że jest ograniczona do 128 bajtów i będziesz musiał przeanalizować ładunek.

Metoda 3: Tworzenie poziomie sesji tabeli tymczasowej po podłączeniu i włożeniu pary nazwa/wartość, które mogą być pobrane z SELECT zapytania:

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

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

pamiętać, że można zwiększyć wielkość wartości atrybutów i wpisz w razie potrzeby i nie jest potrzebne przetwarzanie.

Metoda 4: utworzyć stały stół wprowadzonego przez ID sesji i nazwę atrybutu, włóż pary nazwa/wartość po połączeniu, które mogą być pobierane z SELECT zapytania:

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'; 

pamiętać, że można zwiększyć W razie potrzeby rozmiar i typ wartości atrybutu nie są potrzebne.

EDIT:

Metoda 5 Use procedura przechowywana sp_set_session_context do przechowywania pary nazwa/wartość session-scoped i pobrać wartości z funkcją SESSION_CONTEXT(). Ta funkcja została wprowadzona w SQL Server 2016 i Azure SQL Database.

EXEC sp_set_session_context 'SomeAttr', 'SomeValue'; 
SELECT SESSION_CONTEXT(N'SomeAttr'); 
Powiązane problemy