いくつかのパラメータをとる必要な結果を引き出すための長くて複雑なクエリがあるとします。どれでもかまいませんが、例として:
SELECT
q.PROD_ID, q.NAME, q.STANDARD_PROD, q.DESCRIPTION, q.PART_NUMBER,
q.COMMENTS, q.DESCRIPTION_URL,
PROD_CATEGORY.DESCRIPTION AS CATEGORY_DESCRIPTION,
PROD_TYPES.DESCRIPTION AS PROD_TYPE
FROM
(SELECT
PROD.PROD_ID,
PROD.PROD_TYPE_ID,
PROD.NAME,
PROD.STANDARD_PROD,
PROD.PROD_CATEGORY_ID,
PROD.DESCRIPTION,
PROD.PART_NUMBER,
PROD.COMMENTS,
PROD.DESCRIPTION_URL
FROM
(SELECT
PROD_ID,
PROD_TYPE_ID
FROM
XREF_PRODSYS
WHERE
(PROD_TYPE_ID = (SELECT
PROD_TYPE_ID
FROM
PROD_TYPES
WHERE
(NAME LIKE @prod_type_name)))) AS p
LEFT OUTER JOIN PROD ON p.PROD_ID = PROD.PROD_ID
WHERE
(PROD.NAME LIKE @prod_name)
AND (PROD.HIDDEN = 0)) AS q
LEFT OUTER JOIN PROD_CATEGORY ON q.PROD_CATEGORY_ID = PROD_CATEGORY.PROD_CATEGORY_ID
LEFT OUTER JOIN PROD_TYPES ON q.PROD_TYPE_ID = PROD_TYPES.PROD_TYPE_ID
この特定のクエリは2つのパラメータを取り、おそらくGET/POSTを介して.NETWebアプリに渡されます。
WebアプリケーションページのC#ソースに配置するのではなく、このような長いクエリを保存するためのよりクリーンな方法はありますか?以下の「迅速で汚い」アプローチはうまく機能することを私は知っていますが、それはコードを大幅に拡張し、少し扱いにくくなります。例えば:
//inside Page_Load...
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.Parameters.Add("@prod_type_name", SqlDbType.VarChar).Value = _type_name;
cmd.Parameters.Add("@prod_name", SqlDbType.VarChar).Value = _prod_name;
cmd.CommandText = @"
SELECT q.PROD_ID, q.NAME, q.STANDARD_PROD, q.DESCRIPTION, q.PART_NUMBER, q.COMMENTS, q.DESCRIPTION_URL,
PROD_CATEGORY.DESCRIPTION AS CATEGORY_DESCRIPTION, PROD_TYPES.DESCRIPTION AS PROD_TYPE
FROM (SELECT PROD.PROD_ID, PROD.PROD_TYPE_ID, PROD.NAME, PROD.STANDARD_PROD, PROD.PROD_CATEGORY_ID, PROD.DESCRIPTION,
PROD.PART_NUMBER, PROD.COMMENTS, PROD.DESCRIPTION_URL
FROM (SELECT PROD_ID, PROD_TYPE_ID
FROM XREF_PRODSYS
WHERE (PROD_TYPE_ID =
(SELECT PROD_TYPE_ID
FROM PROD_TYPES
WHERE (NAME LIKE @prod_type_name)))) AS p LEFT OUTER JOIN
PROD ON p.PROD_ID = PROD.PROD_ID
WHERE (PROD.NAME LIKE @prod_name) AND (PROD.HIDDEN = 0)) AS q LEFT OUTER JOIN
PROD_CATEGORY ON q.PROD_CATEGORY_ID = PROD_CATEGORY.PROD_CATEGORY_ID LEFT OUTER JOIN
PROD_TYPES ON q.PROD_TYPE_ID = PROD_TYPES.PROD_TYPE_ID
";
//... do stuff with cmd