sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan tilføjer man brugerdefinerede attributter til SQL-forbindelsesstrengen?

Der er ingen generaliseret metode til at videregive tilpassede forbindelsesstrengattributter via klient-API'er og hente ved hjælp af T-SQL. Du har dog en række alternativer. Nedenfor er nogle få.

Metode 1 :Brug søgeordet Application Name i forbindelsesstrengen til at sende op til 128 tegn og hente 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();

Bemærk, at dette er begrænset til 128 tegn, og du bliver nødt til at analysere nyttelasten. Da ADO.NET opretter en separat forbindelsespulje for hver enkelt forbindelsesstreng, skal du overveje, at der i praksis vil være ringe eller ingen databaseforbindelsespooling.

Metode 2 :Udfør et SET CONTEXT_INFO efter tilslutning og tildel op til 128 bytes, der kan hentes 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));

Bemærk, at dette er begrænset til 128 bytes, og du bliver nødt til at analysere nyttelasten.

Metode 3 :Opret en midlertidig tabel på sessionsniveau efter forbindelse, og indsæt navn/værdi-par, der kan hentes med en SELECT-forespørgsel:

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

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

Bemærk, at du kan øge størrelsen og typen af ​​attributværdien efter behov, og der kræves ingen parsing.

Metode 4 :Opret en permanent tabel tastet af sessions-id og attributnavn, indsæt navn/værdi-par efter forbindelse, der kan hentes med en SELECT-forespørgsel:

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

Bemærk, at du kan øge størrelsen og typen af ​​attributværdien efter behov, og der kræves ingen parsing.

EDIT:

Metode 5 :Brug den lagrede procedure sp_set_session_context til at gemme sessionsbestemte navn/værdi-par og hente værdierne med SESSION_CONTEXT()-funktionen. Denne funktion blev introduceret i SQL Server 2016 og Azure SQL Database.

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


  1. forskel mellem NLS_NCHAR_CHARACTERSET og NLS_CHARACTERSET for Oracle

  2. Oracle In-Memory omkostninger

  3. Vælg kolonner på tværs af forskellige databaser

  4. Brug af automatisering til at fremskynde udgivelsestests på PostgreSQL