残念ながら、Abbathがすでに述べたように、このタイプの構造体はパラメータ化できません。 Abbathが述べたように、最良の解決策は、あなたの絶対的な支配下にそのような議論を残すことですが、そのような構成が必要な時があり、それらを完全に制御することは不可能かもしれません。
この場合、引数をエスケープすることをお勧めします。この場合、サンプルコードで{0}
で表されるDB名。 これを達成するには、2つの潜在的なメカニズムがあります。
a)は、クエリに
優位性をパラメータ化することを可能にするメカニズムを作成します:あなたは、などの任意のドライバ(.NET、ODBC、から同じ溶液を再利用することができます)
短所:もう少し作業します。この場合、selectを直接使用することはありません。例えば、(私はあなたのコードのように、内部結合持っている簡単な例を含めています)
:あなたは、通常と同じようにこの時点で
CREATE PROC sp_MyQuery(@target_db_name sysname, @name nvarchar(100))
AS
BEGIN
DECLARE @cmd nvarchar(max)
DECLARE @parameters nvarchar(max)
SELECT @cmd = N'SELECT * FROM msdb.sys.objects inner join '
+ quotename(@target_db_name) + N'.sys.sql_modules
on msdb.sys.objects.object_id = '
+ quotename(@target_db_name) + N'.sys.sql_modules.object_id WHERE name = @name'
print @cmd -- See the command before it is executed.
set @parameters = N'@name nvarchar(100)'
EXEC sp_executesql @cmd, @parameters, @name = @name
END
go
-- Example of usage
DECLARE @target_db_name sysname = 'msdb'
DECLARE @name nvarchar(100) = 'sp_help_operator'
EXEC sp_MyQuery @target_db_name, @name
go
、あなたはSqlParameter
オブジェクトを使用することができます。たとえば:
sqlcmd.CommandText = @"[dbo].[sp_MyQuery]";
sqlcmd.CommandType = System.Data.CommandType.StoredProcedure;
sqlcmd.Parameters.AddWithValue("@target_db_name", ddl0.selectedvalue);
sqlcmd.Parameters.AddWithValue("@name", ddl1.selectedvalue);
SqlDataReader reader = sqlcmd.ExecuteReader();
b)は、あなたのCLRコード内
利点をDB名をエスケープ:アプリケーション固有のソリューション、あなたは潜在的なユニコード-DBと注意する必要があります。
デメリットを実装する方が簡単照合翻訳の問題例(上記と同じクエリ)の場合
:
sqlcmd.CommandText = String.Format(@"
SELECT * FROM msdb.sys.objects inner join [{0}].sys.sql_modules on msdb.sys.objects.object_id = [{0}].sys.sql_modules.object_id WHERE name = @name;",
ddl0.selectedvalue.Replace("]", "]]"));
sqlcmd.CommandType = System.Data.CommandType.Text;
sqlcmd.Parameters.AddWithValue("@name", ddl1.selectedvalue);
SqlDataReader reader2 = sqlcmd.ExecuteReader();
私は通常、(a)は、それは可能ですが、両方のソリューションを使用すると、SQLインジェクションから保護する必要があるたびソリューションを使用することをお勧めします。
BTW。次のリンクもまた役に立つかもしれません:https://blogs.msdn.microsoft.com/raulga/2007/01/04/dynamic-sql-sql-injection/
私は希望情報が役立ちます。
答えをありがとう。私はこれを調べます。 –