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を実行し、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');
    


    1. SQL Serverでデータファイルを移動する方法–パート1

    2. Access2016でAccessデータベースをSQLServerにリンクする方法

    3. 緯度と経度のデータ型はどれですか?

    4. SQLがwhere句の列エイリアスを認識しない