10

次のような SQL クエリ文字列があります。

DECLARE @sql varchar(max)
SET @sql = ' INSERT INTO ' + @tempTable1 + 
           ' SELECT 0 as Type1, 0 as Type2, ' + 
             '''' + @name + ''' as CompanyName ' + 
           ' FROM #tempTable2 tt2'

たまたま一重引用符が含まれている 2 つの名前 (例: Pete's Corner) を除いて、クエリは正常に実行されます。これらの名前のいずれかがクエリの一部になると、クエリ文字列が壊れます。この replace(@name,'''','') のように一重引用符を置き換えるのが最も簡単だと思いましたが、すでに文字列に含まれているため、残りの部分に影響を与えるため機能しませんステートメント。残念ながら、テーブル自体を変更することはできません。

これらの一重引用符を置換または削除するにはどうすればよいですか?

追加:申し訳ありませんが、 @name が結合によって別のデータベーステーブルから実際に入力されている部分を含めていないため、文字列が作成される前に @name の値を設定するのは難しいと思います。

4

3 に答える 3

6

なぜこれを行う必要があるのですか?sp_executesqlすべてのパラメータを 1 つの文字列に変更して を使用する代わりに、強力なパラメータを に渡す必要がありますEXEC()詳細については、こちらをご覧ください

DECLARE @sql NVARCHAR(MAX), @name NVARCHAR(32);

SET @name = 'Pete''s Corner';

SET @sql = 'INSERT INTO ' + @tempTable1 +
  ' SELECT 0 as Type1, 0 as Type2, @name as CompanyName ' + 
  ' FROM #tempTable2 tt2';

EXEC sp_executesql @sql, N'@name NVARCHAR(32)', @name;

パラメータ@nameは実際には他の場所から入力されると思います.適切なパラメータ化を使用している場合は、'.

今、私は何@tempTable1を表しているのか、または#tempTable2このスコープからアクセスできるかどうかはよくわかりませんが、''''または''''''(または両方) を必要とする置換を実行していることに気付いたときはいつでも、より良い方法があるかどうかを自問する必要があります.

于 2013-08-20T21:19:14.520 に答える
1

sp_executesqlシステム プロシージャを使用できます。sp_executesql を使用すると、@name パラメータを SQL に埋め込む代わりに、動的 SQL を呼び出すことができます。

DECLARE @sql nvarchar(max),
        @name varchar(50)
SET @name = 'qwe'''           
SET @sql = 'INSERT INTO ' + @tempTable1 +
           ' SELECT 0 as Type1, 0 as Type2, ' + 
           '@name as CompanyName ' + 
           'FROM #tempTable2 tt2'
--PRINT @sql
EXEC sp_executesql @sql, N'@name varchar(50)', @name
于 2013-08-20T21:20:04.723 に答える