次のような SqlServer 接続文字列にいくつかのカスタム属性を追加したいと思います。
Integrated Security=SSPI;Extended Properties="SomeAttr=SomeValue";Persist Security Info=False;Initial Catalog=DB;Data Source=SERVER
そして、SQLでその属性を取得します。例えばSELECT SOME_FUNCTION('SomeAttr')
次のような SqlServer 接続文字列にいくつかのカスタム属性を追加したいと思います。
Integrated Security=SSPI;Extended Properties="SomeAttr=SomeValue";Persist Security Info=False;Initial Catalog=DB;Data Source=SERVER
そして、SQLでその属性を取得します。例えばSELECT SOME_FUNCTION('SomeAttr')
クライアント 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()関数で値を取得します。この機能は、SQL Server 2016 と Azure SQL データベースで導入されました。
EXEC sp_set_session_context 'SomeAttr', 'SomeValue';
SELECT SESSION_CONTEXT(N'SomeAttr');
接続文字列で WSID および APP キーワードを使用できます。これらの値は、HOST_NAME() および APP_NAME() 関数を使用して読み取ることができます。詳細については、 http://msdn.microsoft.com/en-us/library/ms130822.aspxを参照してください。