2010-11-17 4 views
12

Comment puis-je obtenir le SQL utilisé pour générer un objet cfquery? Si je cfdump l'objet, il montre qu'il a une propriété "SQL", qui contient la requête réelle. Activer le débogage ne m'aidera pas parce que je fais un appel API, donc la sortie n'est pas du code HTML et les informations de débogage le casseraient. J'essaye juste de déboguer exactement quelle requête est exécutée.Comment puis-je obtenir le SQL à partir d'un objet de requête dans ColdFusion?

<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. ---> 

Répondre

24

Ajoutez un attribut 'result' à votre cfquery. Le SQL est dans la structure de résultat, pas la variable de requête.

+0

Dang ça Todd! Tu m'as battu pendant que je vérifiais mon code! –

+0

Je règle. C'est tout. :) –

+9

Vous pourriez également techniquement plonger en Java et l'obtenir:

0

Avez-vous accès pour activer le débogage via l'administrateur CF? Cela vous donnera une liste déroulante de toutes les requêtes (y compris les instructions SQL) qui sont appelées dans une page donnée.

+1

"Activer le débogage ne m'aidera pas parce que je fais un appel API, donc la sortie n'est pas HTML et les informations de débogage le casseraient." – Kip

4

Utilisez l'attribut result de cfquery. Spécifiez un nom de variable et cela aura une clé appelée sql avec votre sql.

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

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

Si vous cfdump-ing une structure de support des requêtes (pas ce besoin Kip mais je avais besoin SQL), utilisez le metainfo="yes". W/o rendements uniquement les enregistrements de la requête enter image description here ...

<cfset stx={}> 
<cfquery name="stx.q" datasource="norsmaster"> 
    select staff_key from _staff 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

7

Personnellement, je voudrais avoir une SQL qui a tous les paramètres insérés dans ce (plutôt que les points d'interrogation?). De cette façon, je peux simplement copier et coller le SQL pour lancer une requête sur la base de données. Pour ce faire, je reçois un résultat (comme mentionné dans d'autres commentaires), puis utilisez cette fonction ...

<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> 
+0

Je ne devrais pas que cela ne fonctionne pas correctement avec les dates. – Luke

+0

Également ne fonctionne pas correctement s'il peut être littéral? chars le sql, c'est-à-dire, ceux à l'intérieur des guillemets simples. – enigment

1

Si le dumping sortie de débogage au sein de la sortie régulière briserait les choses, je l'utilise toujours <cfdump var="#myvar#" output="c:\filename.html"> De cette façon, le vidage se retrouve dans un fichier HTML séparé.