クライアント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を実行し、CONTEXT_INFOで取得できる最大128バイトを割り当てます)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 :セッションIDと属性名でキー設定された永続テーブルを作成し、接続後に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()関数で値を取得します。この機能は、SQLServer2016およびAzureSQLデータベースで導入されました。
EXEC sp_set_session_context 'SomeAttr', 'SomeValue';
SELECT SESSION_CONTEXT(N'SomeAttr');