2

我正在使用Coldfusion 9和SQL Server 2008.我试图了解这些平台,并且真正学习如何有效地利用这两个平台的报表解决方案。存储过程或sprocs有一些很大的挑战。我想要的只是一个非常简单的答案,可以让我的sprocs达到我可以在CFML中利用它们的地步,并将数据提供给需要它的人员。Coldfusion CFSTOREDPROC不返回表格

我在网上做了一些研究,似乎SQL Server 2008利用临时表放入RAM(@)或写入本地用户(#)的磁盘。我的问题是我似乎无法让生成的临时表从数据库进程调用中将数据返回给ColdFusion,尽管当我运行被添加到SQL Server临时表中的SQL查询部分时,它的工作原理类似于魅力。我想要做的只是向ColdFusion返回一个简单的表格,并确保我以最有效的方式编码。

我试过了: - 使用Return语句,但是这似乎会在RAM表(@)中产生语法错误。 - 使用持久临时表(#) - 虽然各种在线论坛似乎认为通过使用这个应用程序需要一个很大的性能打击这样做。 (每个人都是批评家)

我的目标是: - 学习此过程以及尽可能多地重复使用它 - 学习正确的方法来完成此操作,以便查询也可以执行尽可能。 - 了解我在SPROCS中使用(@)和(#)临时表的情况以及原因。有些人认为持久临时表(#)更好,因为它可以释放编译期间触发的其他sprocs,而其他人认为让服务器去硬盘写入数据会更慢。 - 明白为什么下面的语法不起作用

目前我CFML代码如下所示:

<!--- =========================================================================================================================== 
================================================= Page Resources ================================================================ 
=============================================================================================================================---> 
<CFSTOREDPROC datasource="PoliticalDonationsDB" procedure=" sp_GetCurrentDonationCount_withDateRange" result="DONATIONCOUNT"> 
    <!--- In ---> 
    <cfprocparam cfsqltype="INT" dbvarname="SDate" value="2004"> 
    <cfprocparam cfsqltype="INT" dbvarname="EDate" value="2005"> 
    <!--- OUT ---> 
    <cfprocresult name="DonationCount"> 
</CFSTOREDPROC> 

<!--- =========================================================================================================================== 
================================================= Page Display ================================================================== 
=============================================================================================================================---> 

<HTML> 
    <HEAD> 
     <TITLE><CFOUTPUT>Title</CFOUTPUT></TITLE> 
    </HEAD> 

    <BODY> 

     <div id="logo"> 
     </div><!--- End logo div ---> 

     <div id="currentRecords"> 
      <CFDUMP var="#VARIABLES#"> 
      <CFDUMP VAR="#DONATIONCOUNT#"> 
     </div><!---End currentRecords---> 

     <div id="navigation"> 
      <ul> 
       <li>Companies</li> 
        <ul> 
         <li></li> 
        </ul> 
      </ul> 
     </div><!--- End navigation div---> 

     <div id="statisticsTab"> 
     </div> <!--- End Statistics div---> 

    </BODY> 
</HTML> 

和我的SQL Server的代码如下所示:

Use Politics 
GO 

ALTER procedure sp_GetCurrentDonationCount_withDateRange 
@SDate AS int, 
@EDate AS int 
AS 
BEGIN 
    --Create RAM Table 
    DECLARE @DonationCountTable TABLE 
    (donationKey INT, 
     CompanyKey INT, 
     SenatorKey INT, 
     donationAmount MONEY, 
     donationDateFY INT 
    ) 

    --Put the stuff into the RAM table 
    INSERT INTO @DonationCountTable (donationKey, CompanyKey, SenatorKey, donationAmount, donationDateFY) 
    SELECT * FROM PoliticalDontations 
    WHERE donationDateFY BETWEEN @SDate AND @EDate 
    ORDER BY donationDateFY, CompanyKey ASC 

    --Get the stuff out of the RAM Table 
    SELECT * FROM @DonationCountTable 
END 
+0

dbvarname被弃用的ColdFusion 8的它什么都不做:http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_p- q_14.html – 2012-07-10 21:17:30

回答

3

您需要这个:

<cfprocparam cfsqltype="CF_SQL_INTEGER" value="2004"> 

DBVARNAME被弃用:
http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_p-q_14.html

这是可以接受的CFSQLTYPES

CF_SQL_BIGINT 
CF_SQL_BIT 
CF_SQL_BLOB 
CF_SQL_CHAR 
CF_SQL_CLOB 
CF_SQL_DATE 
CF_SQL_DECIMAL 
CF_SQL_DOUBLE 
CF_SQL_FLOAT 
CF_SQL_IDSTAMP 
CF_SQL_INTEGER 
CF_SQL_LONGVARCHAR 
CF_SQL_MONEY 
CF_SQL_MONEY4 
CF_SQL_NUMERIC 
CF_SQL_REAL 
CF_SQL_REFCURSOR 
CF_SQL_SMALLINT 
CF_SQL_TIME 
CF_SQL_TIMESTAMP 
CF_SQL_TINYINT 
CF_SQL_VARCHAR 
+0

不赞成我做你上面提出的代码的变化。尽管我还没有从SPROC获得任何回报。 – 2012-07-10 21:54:17

+0

如果我从SPROC呼叫中删除空间,这将有所帮助。奇迹般有效。谢谢Evik。 – 2012-07-19 22:52:52

1

尝试:

<cfprocparam cfsqltype="INT" dbvarname="@SDate" value="2004"> 
<cfprocparam cfsqltype="INT" dbvarname="@EDate" value="2005"> 
+0

dbvarname中的ColdFusion 8(http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_p-q_14.html) – 2012-07-10 21:16:22

1
--Put the stuff into the RAM table 
--/// Comment /// (this actually returns the first resultset, consisting of an ADO accessibel object containing the recordcount affected *RW) 
    INSERT INTO @DonationCountTable (donationKey, CompanyKey, SenatorKey, donationAmount, donationDateFY) 
    SELECT * FROM PoliticalDontations 
    WHERE donationDateFY BETWEEN @SDate AND @EDate 
    ORDER BY donationDateFY, CompanyKey ASC 

的名单我想说的话 - 陷阱人们有时会在存储过程中陷入的是,大量的的命令会产生一个记录集对象(你的INSERT ... SELECT在这个例子中),我怀疑你不想要所有这些记录集,或者至少你需要我们e选择适当的一个。

解决此问题的一种方法是在CREATE ... AS之后立即启动。与“SET NOCOUNT ON”声明。我这么做 - 那么你的:

  --Get the stuff out of the RAM Table 
     SELECT * FROM @DonationCountTable 

应该返回唯一的结果集。我知道这是旧的,但也许它有助于某人。这肯定是过去几年影响我的SQL编码的事情 - 不确定MySQL或Oracle是否会产生类似的问题/或者是否有类似的问题。

R白色 - 偷渡式贡献者