1

当我通过执行存储cfstoredproc过程时,我得到的结果与通过调用存储过程不同cfquery。我将相同的确切参数值传递给每个调用。而且,当我在 SQL Studio 中运行存储过程时,我得到了正确的结果(与 cfquery 相同)。

这是cfstoredproc电话

<cfstoredproc datasource="#request.mainDSN#" debug="#request.debug#" procedure="rankingresults">
   <cfprocparam type="in" value="8652" CFSQLType="CF_SQL_INTEGER">
   <cfprocparam type="in" value="50" CFSQLType="CF_SQL_INTEGER">
   <cfprocparam type="in" value="53" CFSQLType="CF_SQL_INTEGER">
   <cfprocresult name="local.listing">
</cfstoredproc>

这是cfquery电话

<cfquery datasource="#request.mainDSN#" name="rankings">
   EXEC rankingresults
    @CityZipId = 8652,
    @distance = 50,
    @sic = 53
</cfquery>

结果完全不同。它甚至不接近。我已经为此困扰了几个小时,但我无法弄清楚为什么它正在做它正在做的事情。

更新

存储的过程很大(也是我继承的),所以我不打算在这里全部粘贴:http: //pastebin.com/EtufPWXf

4

2 回答 2

12

(来自评论)

看起来它确实有可选参数。因此,您的cfstoredproc调用可能不会传递您认为的值。根据顺序,看起来它实际上是在传递值:@CityZipID, @Sic, @lastRank。正如 Dan 提到的(我也暗示过),cfstoredproc 对参数使用位置表示法(不推荐使用 @dbVarName)。您需要以正确的顺序提供所有参数值。

更新:

FWIW,如果您创建一个 shell 过程,您会看到 cfstoredproc 和 cfquery 实际上正在调用具有不同参数/值的过程。(见下文)。

如果您在没有@Dan 建议的命名参数的情况下调用该过程,您肯定会看到结果有所不同,即exec rankingresults 8652, 50, 53。(我知道您说“没有变化”,但您的测试中可能只是一个错误)。

CFSTOREDPROC

@ATTRCODES|@CITYZIPID|@DISTANCE|@HASURL |@ISFEATURED |@LASTRANK|@PHOTOCOUNT|@REVIEWCOUNT |@SIC|@SICBUDGETIDS 
(nothing)| 8652| (nothing)| (nothing)| (nothing)| 53| (nothing)| (nothing)| 50| (nothing)

CF查询

@ATTRCODES|@CITYZIPID|@DISTANCE|@HASURL |@ISFEATURED |@LASTRANK|@PHOTOCOUNT|@REVIEWCOUNT |@SIC|@SICBUDGETIDS 
(nothing)| 8652| 50| (nothing)| (nothing)| 0| (nothing)| (nothing)| 53| (nothing)
于 2013-01-24T18:44:09.387 回答
0

如果直接在 sql server 上运行,会返回多少个结果?您可能会返回多个可以解释行为差异的结果。

于 2013-01-24T19:08:32.797 回答