sql >> データベース >  >> RDS >> Sqlserver

SESSION_CONTEXT()がSQLServerでどのように機能するか

    SQL Serverでは、SESSION_CONTEXT()を使用できます。 現在のセッションコンテキストで指定されたキーの値を読み取る関数。

    キー(キー/値のペア)を最初に設定する必要があります。これは、sp_set_session_contextを使用して実行できます。 ストアドプロシージャ。

    キーと値のペアがセッションに設定されると、SESSION_CONTEXT()を使用できます。 そのキーの値を返します。

    例1-値を設定して返す

    これは、基本的な概念と使用法を示す例です。

    EXEC sp_set_session_context
      @key = N'user_id',
      @value = 15;
    
    SELECT SESSION_CONTEXT(N'user_id') AS user_id;
    

    結果:

    +-----------+
    | user_id   |
    |-----------|
    | 15        |
    +-----------+
    

    例2–キーが存在しない場合

    存在しないキーから値を取得しようとすると、次のようになります。

    SELECT SESSION_CONTEXT(N'oops') AS oops;
    

    結果:

    +--------+
    | oops   |
    |--------|
    | NULL   |
    +--------+
    

    例3–「N」プレフィックス

    SESSION_CONTEXT()に提供される引数 タイプはsysnameです 。基本的に、これはnvarchar(128) NOT NULLと同じです。 、つまり、引数の前にNを付ける必要があります キャラクター。

    Nを削除するとどうなりますか プレフィックス:

    EXEC sp_set_session_context
      @key = 'language',
      @value = 'English';
    
    SELECT SESSION_CONTEXT('language') AS language;
    

    結果:

    Msg 8116, Level 16, State 1, Line 5
    Argument data type varchar is invalid for argument 1 of session_context function.
    

    Nを削除する プレフィックス、 varcharを渡すだけです 、 nvarcharである必要がある場合 (または sysname 正確には)。

    これがNです プレフィックス:

    EXEC sp_set_session_context
      @key = N'language',
      @value = 'English';
    
    SELECT SESSION_CONTEXT(N'language') AS language;
    

    結果:

    +------------+
    | language   |
    |------------|
    | English    |
    +------------+
    

    例4–戻り値

    SESSION_CONTEXT()の戻りタイプ sql_variantです 。

    SQL_VARIANT_PROPERTY()を使用できます 基本タイプを見つけるための関数。

    例:

    SELECT 
      SQL_VARIANT_PROPERTY(
          SESSION_CONTEXT(N'user_id'), 'BaseType'
          ) AS user_id,
      SQL_VARIANT_PROPERTY(
          SESSION_CONTEXT(N'language'), 'BaseType'
          ) AS language;
    

    結果:

    +-----------+------------+
    | user_id   | language   |
    |-----------+------------|
    | int       | varchar    |
    +-----------+------------+
    

    例5–戻り値の連結

    複数の結果を連結する必要がある場合は、結果を sql_variant以外のデータ型に変換する必要があります 最初。

    これを行わないとどうなるかの例を次に示します。

    例:

    EXEC sp_set_session_context N'user_fname', 'Homer';
    EXEC sp_set_session_context N'user_lname', 'Simpson';
    
    SELECT 
      CONCAT(
          SESSION_CONTEXT(N'user_fname'), 
          SESSION_CONTEXT(N'user_lname')
          ) AS Result;
    
    >

    結果:

    Msg 257, Level 16, State 3, Line 1
    Implicit conversion from data type sql_variant to varchar is not allowed. Use the CONVERT function to run this query.
    

    したがって、CAST()のいずれかを使用して結果を明示的に変換する必要があります またはCONVERT() それらを連結する前に。

    例:

    EXEC sp_set_session_context N'user_fname', 'Homer';
    EXEC sp_set_session_context N'user_lname', 'Simpson';
    
    SELECT 
      CONCAT(
          CAST(SESSION_CONTEXT(N'user_fname') AS varchar(5)),
          CAST(SESSION_CONTEXT(N'user_lname') AS varchar(7))
          ) AS Result;
    

    結果:

    +--------------+
    | Result       |
    |--------------|
    | HomerSimpson |
    +--------------+
    

    1. PostgreSQLのMAX()関数

    2. SQL Server認証とWindows認証:どちらをいつ使用するか

    3. クラスター間レプリケーションの概要

    4. エラーを修正する方法:列c.relhasoidsはPostgresに存在しませんか?