0

私が次のブログで読んだように...

http://www.sommarskog.se/dynamic_sql.html

動的SQLは安全ではないため、sp_executeSQLがあります。

sp_executeにこのようなプロシージャを実行させる方法はありますか...

declare @QueryMain as varchar(8000)
declare @QueryBody as varchar(8000)
declare @QueryWhere as varchar(8000)

set @QueryMain = <8000 charactes>
set @QueryBody = <8000 characters>
set @QueryWhere = <8000 characters>

exec (@queryMain+@QueryBody+@QueryWhere)

これは実行されますが、記事を読んだのでお勧めしません...しかし、この種のクエリを実行する別の方法があるかどうか知りたいです... 3つの変数をntextに組み込んでみましたが、それは機能しませんでした、そしてところで...上記の例のクエリには、日付、ユーザーID、その他何でもかまいませんが、クエリ内に他の変数があります!

私はSQLServer2000を使用しています...そしてグーグルで検索したので、SQL Server 2000の大きな文字列を操作する方法の結果は見つかりませんでしたが、SQLi攻撃の結果があります。

4

1 に答える 1

3

あなたがこれを行うことができるかどうか尋ねている場合:

EXEC sp_executesql @QueryMain + @QueryBody + @QueryWhere;

いいえ、パラメータ値として式や式を使用することはできません。しかし、なぜあなたはそうする必要がありますか?回避策は簡単です。中間変数に追加するだけです(これはNVARCHAR(MAX)NTEXT推奨であり、ローカル変数には無効です)。

DECLARE @sql NVARCHAR(MAX);

...

SET @sql = @QueryMain + @QueryBody + @QueryWhere;

EXEC sp_executesql @sql;

実際、これらの変数はすべて。である必要がありますNVARCHAR

vs.の詳細については、この投稿をEXECsp_executesql参照してください。

于 2013-01-24T01:44:29.757 に答える