他のプログラマがSQLCommandオブジェクトのCommandTextとして実行するために動的SQL文字列をどのように生成しているのか尋ねたいと思います。SQLを動的に生成する標準的な方法はありますか?
私は、ユーザが生成したWHERE句とSELECTフィールドを含むパラメータ化されたクエリを生成しています。クエリが複雑な場合もあり、さまざまなパーツの作成方法について多くの制御が必要です。
現在、多くのループとswitch文を使用して、必要なSQLコードフラグメントを生成し、必要なSQLパラメータオブジェクトを作成しています。この方法は従うのが難しく、メンテナンスが本当の雑用になります。
これを行うクリーナー、より安定した方法がありますか?
任意の提案??
EDIT: は私の以前の記事に詳細を追加するには:
1.私は本当に私のクエリをテンプレート化することができないため、要件に。それはあまりにも多く変更されます。
- Count()のような集計関数を許可する必要があります。これはGroup By/Having句に影響します。また、ネストされたSELECT文も発生します。これは、次に使用される列名に影響します
- 一部の連絡先データはXML列に格納されます。ユーザーはこのデータをAS ASと他のリレーショナル列と一緒に照会できます。その結果、xml列はGroup By節[SQL構文]に現れません。
- Row_Number()SQL関数を使用する効率的なページング手法を使用しています。結果として、Tempテーブルを使用して、サブセットを選択する前に2番目のクエリを避けるために@@ rowcountを取得する必要があります。
私はいくつかのコード(ホラー!)を表示しますので、あなたは私が扱っているもののアイデアを持っています。この例:で
sqlCmd.CommandText = "DECLARE @t Table(ContactId int, ROWRANK int" + declare
+ ")INSERT INTO @t(ContactId, ROWRANK" + insertFields + ")"//Insert as few cols a possible
+ "Select ContactID, ROW_NUMBER() OVER (ORDER BY " + sortExpression + " "
+ sortDirection + ") as ROWRANK" // generates a rowrank for each row
+ outerFields
+ " FROM (SELECT c.id AS ContactID"
+ coreFields
+ from // sometimes different tables are required
+ where + ") T " // user input goes here.
+ groupBy+ " "
+ havingClause //can be empty
+ ";"
+ "select @@rowcount as rCount;" // return 2 recordsets, avoids second query
+ " SELECT " + fields + ",field1,field2" // join onto the other cols n the table
+" FROM @t t INNER JOIN contacts c on t.ContactID = c.id"
+" WHERE ROWRANK BETWEEN " + ((pageIndex * pageSize) + 1) + " AND "
+ ((pageIndex + 1) * pageSize); // here I select the pages I want
。私はXMLデータを照会しています。純粋なリレーショナルデータの場合、クエリはずっと簡単です。 セクション変数はそれぞれStringBuildersです。節はそのように構築されている場合:好奇心のうち
//Add Parameter to SQL Command
AddParamToSQLCmd(sqlCmd, "@p" + z.ToString(), SqlDbType.VarChar, 50, ParameterDirection.Input, qc.FieldValue);
// Create SQL code Fragment
where.AppendFormat(" {0} {1} {2} @p{3}", qc.BooleanOperator, qc.FieldName, qc.ComparisonOperator, z);
実際にはオプションがないかもしれませんが、オラクルがこれらのSQL文を遭遇するたびにハード解析して処理速度を落とすようなデータベースを保持しているかもしれません。さらに悪いことに、キャッシュされた説明をスタックから外して、他のユーザーに同じように影響を与えます。 – ScottCher