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

SQLServerで一重引用符をエスケープする

    アドバイスの一言。動的スクリプトをテストするときは、実行するのではなく、最初に表示するだけです。そうすれば、EXECで表示されるのとまったく同じように表示できます。 ステートメント。

    今問題に。 変数を渡していないことに注意してください。 SplitValuesへ ただし、代わりに変数の値をスクリプトに連結しています。値はvarcharなので 、周囲を引用符で囲む必要があります。それらがないことが本当に唯一の問題です。

    2番目の引数であるコンマを囲む引用符は、どちらの場合も正しくエスケープされます 。したがって、いずれかの方法を使用して、最初の引数を引用符で囲みます。

    • 引用符の繰り返し:

      DECLARE @year varchar(max), @sql varchar(max);
      SET @year = '111,11';
      SET @sql = 'SELECT * FROM SplitValues(''' + @year + ''','','')';
      SELECT @sql;
      
    • CHAR(39)を使用する :

      DECLARE @year varchar(max), @sql varchar(max);
      SET @year = '111,11';
      SET @sql = 'SELECT * FROM SplitValues(' + CHAR(39) + @year + CHAR(39) + ',' + CHAR(39) + ',' + CHAR(39) + ')';
      SELECT @sql;
      

    明らかに、最初の方法はよりコンパクトですが、私が言ったように、このSQL Fiddleデモが明確に示しているように、両方ともうまく機能します。

    ただし、しゃれを許せば、そもそもこの問題を簡単に回避できることに注意してください。 EXEC ()の代わりに 、EXEC sp_executesqlを使用できます 、パラメータを使用できます 。これは、sp_executesqlを使用するように書き直された同じスクリプトです。 :

    DECLARE @year varchar(max), @delim char(1);
    SET @year = '111,11';
    SET @delim = ',';
    EXEC sp_executesql
      N'SELECT * FROM SplitValues(@year_param,@delim_param)',
      N'@year_param varchar(max), @delim_param char(1)',
      @year,@delim;
    

    ご覧のとおり、引用符をエスケープすることを心配する必要はありません。SQLServerは、ユーザーではなく、値を正しく置き換える手間をかけます。



    1. 1つの列に複数の値を返す方法(T-SQL)?

    2. パフォーマンスの問題:最初の遭遇

    3. OracleDatabaseでデータベースオブジェクトとしてVARRAYを作成する方法

    4. OracleSQL句の評価順序