Как добавить пользовательские атрибуты в строку подключения SQL?
Я хочу добавить некоторые пользовательские атрибуты в строку подключения SqlServer, что-то вроде этого:
Integrated Security=SSPI;Extended Properties="SomeAttr=SomeValue";Persist Security Info=False;Initial Catalog=DB;Data Source=SERVER
а затем получить этот атрибут в sql. например SELECT SOME_FUNCTION('SomeAttr')
2 ответов
нет обобщенного метода для передачи пользовательских атрибутов строки подключения через клиентские API и извлечения с помощью T-SQL. Однако у вас есть несколько альтернатив. Ниже несколько.
Способ 1: используйте ключевое слово имя приложения в строке подключения, чтобы передать до 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: выполните набор 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';
обратите внимание, что вы можете увеличить размер значения атрибута и введите по мере необходимости, и синтаксический анализ не требуется.
EDIT:
Метод 5: используйте хранимую процедуру sp_set_session_context для хранения пар имя/значение в области сеанса и получить значения с SESSION_CONTEXT ()
вы можете использовать ключевые слова WSID и APP в строке подключения. Вы можете прочитать эти значения, используя функции HOST_NAME() и APP_NAME (). См.http://msdn.microsoft.com/en-us/library/ms130822.aspx для деталей.