web-dev-qa-db-ja.com

ColdFusionのクエリオブジェクトからSQLを取得するにはどうすればよいですか?

Cfqueryオブジェクトの生成にSQLを使用するにはどうすればよいですか?オブジェクトをcfdumpすると、実際のクエリを含む「SQL」プロパティを持つことが示されます。 API呼び出しを行っているため、デバッグをオンにしても効果がありません。そのため、出力はHTMLではなく、デバッグ情報によって破損します。実行されているクエリを正確にデバッグしようとしています。

<cfquery name="tableElements" datasource="TestSQLServer">
SELECT * FROM tableElements
</cfquery>

<cfdump var="#tableElements#" /> <!--- Shows object having "SQL" property --->
<cfoutput>SQL: #tableElements.SQL#</cfoutput> <!--- Error: Element SQL is undefined in TABLEELEMENTS. --->
17
Kip

'result'属性をcfqueryに追加します。 SQLは、クエリ変数ではなく、結果構造体にあります。

30
Todd Sharp
<cfquery name="tableElements" datasource="TestSQLServer" result="r">
SELECT * FROM tableElements
</cfquery>

<cfdump var="#tableElements#" /> <!--- Shows object having "SQL" property --->
<cfoutput>SQL: #r.SQL#</cfoutput>
19
Adam Tuttle

個人的には、(?疑問符ではなく)すべてのパラメーターが挿入されたSQLが必要です。このようにして、SQLをコピーして貼り付けるだけで、データベースに対してクエリを実行できます。これを行うには、(他のコメントで述べられているように)結果を取得し、この関数を使用します...

<cffunction name="getRealSQL" returntype="string">
    <cfargument name="qryResult" type="any">
    <cfset realSQL = arguments.qryResult.sql>
    <cfloop array="#arguments.qryResult.sqlParameters#" index="a">
        <cfscript>
            if (NOT isNumeric(a)) a = "'#a#'";
            realSQL = Replace(realSQL, "?", a);
        </cfscript>
    </cfloop>
    <cfreturn realSQL>
</cffunction>
8
Luke

Cfqueryのresult属性を使用します。変数名を指定すると、SQLでsqlというキーが使用されます。

4
Sam Farmer

クエリを保持する構造(Kipが必要とするものではなく、SQLが必要)をcfdumpする場合は、metainfo="yes"を使用します。 W/oは、クエリのレコードのみを生成しますenter image description here.。

<cfset stx={}>
<cfquery name="stx.q" datasource="myDataSource">
    select emp_id from employees where 1=2
</cfquery>
<cfdump var="#stx.q#">
<cfdump var="#stx.q#" metainfo="yes">

examples of cfdump of a query in a struct without and with metainfo attribute

2
gordon

通常の出力内にデバッグ出力をダンプすると問題が発生する場合は、常に<cfdump var="#myvar#" output="c:\filename.html">を使用します。そうすると、ダンプは別のHTMLファイルになります。

1
Sander

CF管理者を介してデバッグをオンにするためのアクセス権がありますか?これにより、特定のページで呼び出されているすべてのクエリ(SQLステートメントを含む)のローリングリストが表示されます。

0
Steve K.