Nie ma uogólnionej metody przekazywania niestandardowych atrybutów parametrów połączenia za pośrednictwem interfejsów API klienta i pobierania przy użyciu T-SQL. Masz jednak kilka alternatyw. Poniżej kilka.
Metoda 1 :Użyj słowa kluczowego Application Name w ciągu połączenia, aby przekazać do 128 znaków i pobrać za pomocą funkcji APP_NAME() T-SQL:
Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DB;Data Source=SERVER;Application Name="SomeAttr=SomeValue"
SELECT APP_NAME();
Pamiętaj, że jest to ograniczone 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 pula połączeń z bazą danych będzie w rzeczywistości niewielka lub nie będzie jej wcale.
Metoda 2 :Wykonaj SET CONTEXT_INFO po połączeniu i przypisz do 128 bajtów, które można pobrać za pomocą funkcji T-SQL CONTEXT_INFO:
DECLARE @context_info varbinary(128) = CAST('SomeAttr=SomeValue' AS varbinary(128));
SET CONTEXT_INFO @context_info;
SELECT CAST(CONTEXT_INFO() AS varchar(128));
Pamiętaj, że jest to ograniczone do 128 bajtów i będziesz musiał przeanalizować ładunek.
Metoda 3 :Utwórz tymczasową tabelę na poziomie sesji po połączeniu i wstaw pary nazwa/wartość, które można pobrać za pomocą zapytania SELECT:
CREATE TABLE #CustomSessionAttributes(
AttributeName varchar(128) PRIMARY KEY
, AttributeValue varchar(1000));
INSERT INTO #CustomSessionAttributes VALUES('SomeAttr', 'SomeValue');
SELECT AttributeValue
FROM #CustomSessionAttributes
WHERE AttributeName = 'SomeAttr';
Zwróć uwagę, że możesz zwiększyć rozmiar i typ wartości atrybutu w razie potrzeby i nie jest potrzebne parsowanie.
Metoda 4 :Utwórz stałą tabelę z kluczami według identyfikatora sesji i nazwy atrybutu, wstaw pary nazwa/wartość po połączeniu, które można pobrać za pomocą zapytania SELECT:
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';
Zwróć uwagę, że możesz zwiększyć rozmiar i typ wartości atrybutu w razie potrzeby i nie jest potrzebne parsowanie.
EDYTUJ:
Metoda 5 :Użyj procedury składowanej sp_set_session_context do przechowywania par nazwa/wartość o zakresie sesji i pobierania wartości za pomocą funkcji 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');