Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да добавя персонализирани атрибути към SQL низ за връзка?

Няма обобщен метод за предаване на персонализирани атрибути на низове за връзка чрез клиентски API и извличане с помощта на T-SQL. Все пак имате редица алтернативи. По-долу са няколко.

Метод 1 :Използвайте ключовата дума Application Name в низа за връзка, за да предадете до 128 знака и да извлечете с функцията APP_NAME() T-SQL:

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

SELECT APP_NAME();

Имайте предвид, че това е ограничено до 128 знака и ще трябва да анализирате полезния товар. Освен това, тъй като ADO.NET създава отделен пул за връзки за всеки отделен низ за връзка, помислете, че ефективно ще има малко или никакво обединяване на връзки към базата данни.

Метод 2 :Изпълнете SET CONTEXT_INFO след свързване и задайте до 128 байта, които могат да бъдат извлечени с 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));

Имайте предвид, че това е ограничено до 128 байта и ще трябва да анализирате полезния товар.

Метод 3 :Създайте временна таблица на ниво сесия след свързване и вмъкнете двойки име/стойност, които могат да бъдат извлечени със заявка 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';

Имайте предвид, че можете да увеличите размера и типа на стойността на атрибута според нуждите и не е необходим синтактичен анализ.

Метод 4 :Създайте постоянна таблица с ключ от идентификатор на сесия и име на атрибут, вмъкнете двойки име/стойност след свързване, които могат да бъдат извлечени със заявка 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';

Имайте предвид, че можете да увеличите размера и типа на стойността на атрибута според нуждите и не е необходим синтактичен анализ.

РЕДАКТИРАНЕ:

Метод 5 :Използвайте съхранената процедура sp_set_session_context за съхраняване на двойки име/стойност с обхват на сесията и извличане на стойностите с функцията SESSION_CONTEXT(). Тази функция беше въведена в SQL Server 2016 и Azure SQL база данни.

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. Ефективност на условно агрегиране

  2. Какво представлява предаването на параметри към SQL и защо ми е необходимо?

  3. Как мога да се свържа с външна база данни от sql оператор или съхранена процедура?

  4. Използвайте OBJECTPROPERTY(), за да определите дали даден обект е изглед в SQL Server

  5. Пълно ръководство за коригиране на грешка в SQL база данни 5243