2

我正在使用 Coldfusion 9 和 SQL Server 2008。我正在尝试学习这些平台并真正学习如何有效地利用这两个平台来生成报告解决方案。我在存储过程或存储过程方面遇到了一些巨大的挑战。我想要的只是一个非常简单的答案,让我的存储过程达到我可以在 CFML 中利用它们并将数据提供给需要它的人的程度。

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

我试过: - 使用 Return 语句,但这似乎会产生 RAM 表 (@) 的语法错误。- 使用持久临时表 (#) - 尽管各种在线论坛似乎认为使用此功能,但应用程序会因此而受到很大的性能影响。(每个人都是批评家。)

我的目标是: - 尽可能多地学习这个过程,尽可能多地重复使用它 - 学习正确的方法来做到这一点,以便查询尽可能好地执行。- 了解在什么情况下我在 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
4

3 回答 3

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
于 2012-07-10T21:18:54.503 回答
1
--把东西放到RAM表中
--/// 注释 /// (这实际上返回第一个结果集,由一个 ADO accessibel 对象组成,该对象包含受影响的记录计数 *RW)
     插入@DonationCountTable(donationKey、CompanyKey、SenatorKey、donationAmount、donationDateFY)
     从政治捐款中选择 *
     @SDate 和 @EDate 之间的捐赠日期
     ORDER BYdonationDateFY, CompanyKey ASC

我想说-人们有时会陷入存储过程的陷阱是许多命令会导致记录集对象(您的 INSERT...SELECT 在此示例中执行),我怀疑您要么不想要所有这些记录集,或者至少你需要使用来选择合适的。

解决此问题的一种方法是在 CREATE...AS 之后立即开始。使用“SET NOCOUNT ON”语句。我经常这样做 - 然后你的:

        -- 从 RAM 表中取出东西
       选择 * 从 @DonationCountTable  

应该返回唯一的结果集。我知道这很旧,但也许它可以帮助某人。这肯定是在过去几年影响了我的 SQL 编码的东西——不确定 MySQL 或 Oracle 是否会产生类似的问题/或有类似的修复。

R White - 路过的贡献者

于 2012-08-02T19:05:28.313 回答
1

尝试:

 <cfprocparam cfsqltype="INT" dbvarname="@SDate" value="2004">
 <cfprocparam cfsqltype="INT" dbvarname="@EDate" value="2005">
于 2012-07-10T21:11:30.627 回答