Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak dodać niestandardowe atrybuty do ciągu połączenia SQL?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyniki dynamicznego SQL w tabeli tymczasowej w procedurze SQL Stored

  2. Jak określić lokalizację plików danych i plików dziennika podczas tworzenia bazy danych w SQL Server

  3. Przestawiaj wiele kolumn na podstawie jednej kolumny w SQL Server

  4. Jak naprawić „Schemat partycji ‚…’ nie ma żadnej następnej używanej grupy plików” w SQL Server

  5. Jak połączyć serwer sql z php za pomocą xampp?