1

次の構文で呼び出される 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、関数に渡される埋め込み句の ' 引用符内にパラメータを埋め込む方法がわかりません。

何か案は?

4

1 に答える 1

1

だった

SELECT Field1, COUNT(*) AS RecordCount FROM GetDecileTable('WHERE
ClientID = @ClientID AND LocationName = @LocationName ',10)

したほうがいい

SELECT Field1, COUNT(*) AS RecordCount FROM GetDecileTable('WHERE
ClientID = ' + @ClientID + ' AND LocationName = ' + @LocationName,10)

変数は文字列内で使用され、文字列の一部と見なされます。

于 2010-03-30T13:45:02.733 に答える