次の構文で呼び出される MS SQL 関数があります。
SELECT Field1, COUNT(*) AS RecordCount
FROM GetDecileTable('WHERE ClientID = 7 AND LocationName = ''Default'' ', 10)
最初のパラメーターWHERE
は、内部クエリの 1 つの関数によって使用される特定の句を渡します。フロントエンドの C# ページでこの関数を呼び出すときは、WHERE
句内の個々のフィールドのパラメーター値を送信する必要があります (この例では、ClientID
&LocationName
フィールドの両方) 。
現在の C# コードは次のようになります。
String SQLText = "SELECT Field1, COUNT(*) AS RecordCount FROM GetDecileTable('WHERE
ClientID = @ClientID AND LocationName = @LocationName ',10)";
SqlCommand Cmd = new SqlCommand(SQLText, SqlConnection);
Cmd.Parameters.Add("@ClientID", SqlDbType.Int).Value = 7; // Insert real ClientID
Cmd.Parameters.Add("@LocationName", SqlDbType.NVarChar(20)).Value = "Default";
// Real code uses Location Name from user input
SqlDataReader reader = Cmd.ExecuteReader();
これを行うと、SQL プロファイラーから次のコードを取得します。
exec sp_executesql N'SELECT Field1, COUNT(*) as RecordCount FROM GetDecileTable
(''WHERE ClientID = @ClientID AND LocationName = @LocationName '',10)',
N'@ClientID int,@LocationID nvarchar(20)',
@ClientID=7,@LocationName=N'Default'
@ClientID
これが実行されると、SQL は、スカラー変数を定義する必要があることを示す最初の言及を超えて解析できないというエラーをスローします@ClientID
。最初に変数を宣言するようにコードを変更すると (以下を参照)、@ClientID
変数が既に存在するという 2 回目の言及でエラーが発生します。
exec sp_executesql N'DECLARE @ClientID int; DECLARE @LocationName nvarchar(20);
SELECT Field1, COUNT(*) as RecordCount FROM GetDecileTable
(''WHERE ClientID = @ClientID AND LocationName = @LocationName '',10)',
N'@ClientID int,@LocationName nvarchar(20)',
@ClientID=7,@LocationName=N'Default'
パラメータを追加して C# から SQL コードを呼び出すこの方法は、テーブルからデータを選択するときにうまく機能することはわかっていますがWHERE
、関数に渡される埋め込み句の ' 引用符内にパラメータを埋め込む方法がわかりません。
何か案は?