sql >> Databasteknik >  >> RDS >> Sqlserver

Hur lägger man till anpassade attribut till SQL-anslutningssträngen?

Det finns ingen generaliserad metod för att skicka anpassade anslutningssträngattribut via klient-API:er och hämta med T-SQL. Du har dock ett antal alternativ. Nedan är några.

Metod 1 :Använd nyckelordet Application Name i anslutningssträngen för att skicka upp till 128 tecken och hämta med APP_NAME() T-SQL-funktionen:

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

SELECT APP_NAME();

Observera att detta är begränsat till 128 tecken och du måste analysera nyttolasten. Dessutom, eftersom ADO.NET skapar en separat anslutningspool för varje distinkt anslutningssträng, bör du tänka på att det faktiskt kommer att finnas lite eller ingen databasanslutningspooling.

Metod 2 :Kör en SET CONTEXT_INFO efter anslutning och tilldela upp till 128 byte som kan hämtas med CONTEXT_INFO) T-SQL-funktionen:

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

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

Observera att detta är begränsat till 128 byte och du måste analysera nyttolasten.

Metod 3 :Skapa en tillfällig tabell på sessionsnivå efter anslutning och infoga namn/värdepar som kan hämtas med en SELECT-fråga:

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

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

Observera att du kan öka attributvärdets storlek och typ efter behov, och ingen analys behövs.

Metod 4 :Skapa en permanent tabell med sessions-id och attributnamn, infoga namn/värdepar efter anslutning som kan hämtas med en SELECT-fråga:

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

Observera att du kan öka attributvärdets storlek och typ efter behov, och ingen analys behövs.

EDIT:

Metod 5 :Använd den lagrade proceduren sp_set_session_context för att lagra sessionsomfattade namn/värdepar och hämta värdena med SESSION_CONTEXT()-funktionen. Den här funktionen introducerades i SQL Server 2016 och Azure SQL Database.

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


  1. Vad är SQL? Vad är en databas? Relationella databashanteringssystem (RDBMS) förklaras på vanlig engelska.

  2. SQL RANK() kontra ROW_NUMBER()

  3. Hur man hittar sorteringen i SQL Server (T-SQL)

  4. Batch Mode Bitmaps i SQL Server