2014-08-30 1 views
10

Я хочу, чтобы добавить некоторые пользовательские атрибуты в строке соединения SqlServer, что-то вроде этого:Как добавить пользовательские атрибуты в строку подключения SQL?

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

А затем получить этот атрибут в SQL. например SELECT SOME_FUNCTION('SomeAttr')

ответ

16

Не существует обобщенного метода передачи пользовательских атрибутов строки подключения через клиентские 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: Выполнение SET CONTEXT_INFO после подключения и назначить до 128 байт, которые могут быть retreived с функцией 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: Создать временную таблицу уровня сеанса после подключения и вставьте пары имя/значение, которые можно получить с помощью запроса на выборку:

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

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 Database.

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

Вы можете использовать ключевые слова WSID и APP в строке соединения. Вы можете прочитать эти значения, используя функции HOST_NAME() и APP_NAME(). См. http://msdn.microsoft.com/en-us/library/ms130822.aspx.

 Смежные вопросы

  • Нет связанных вопросов^_^