Coldfusion CFSTOREDPROC не возвращает таблицу


Я использую Coldfusion 9 и SQL Server 2008. Я пытаюсь изучить платформы и действительно узнать, как эффективно использовать обе платформы для решения проблемы отчетности. У меня были некоторые большие проблемы с хранимыми процедурами или sprocs. Все, что мне нужно, - это действительно простой ответ, чтобы довести мои sprocs до точки, где я могу использовать их в CFML и передавать данные людям, которые в этом нуждаются.

Я провел некоторые исследования в интернете, и оказалось, что SQL Server 2008 использует временные таблицы, которые помещаются в оперативную память ( @ ) или записываются на диск для локального пользователя (#). Моя проблема заключается в том, что я не могу заставить сгенерированную временную таблицу возвращать данные обратно в ColdFusion из вызова процесса, хотя при запуске части SQL-запроса, которая добавляется во временную таблицу в SQL Server, это работает как заклинание. Все, что я хочу сделать, это вернуть простую таблицу в ColdFusion и убедиться, что я кодирую ее в наиболее эффективном виде.

Я пытался.: - Используя оператор Return, но это похоже, генерирует синтаксические ошибки с таблицами ОЗУ (@). - Использование постоянных временных таблиц ( # ) - хотя различные интернет-форумы, кажется, думают, что с помощью этого приложение получает большой удар производительности, делая это. (Все-критики.)

Мои цели таковы:: - Чтобы изучить этот процесс так хорошо, как я могу, чтобы повторно использовать его столько, сколько я могу - Узнайте, как правильно это сделать, чтобы запрос выполнялся как можно лучше. - Понять, в каких ситуациях я использую (@) и (#) временные таблицы в 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
3 2

3 ответа:

Вам нужно вот что:

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

DBVARNAME-это deprecated:
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

Попробуйте:

 <cfprocparam cfsqltype="INT" dbvarname="@SDate" value="2004">
 <cfprocparam cfsqltype="INT" dbvarname="@EDate" value="2005">
--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 

Я хотел сказать-ловушка, в которую люди иногда попадают с хранимыми процедурами, заключается в том, что множество команд приведет к объекту набора записей (ваша вставка...SELECT does в этом примере), я подозреваю, что вы либо не хотите все эти наборы записей, или, по крайней мере, вам нужно использовать, чтобы выбрать правильный.

Один из способов обойти это-начать сразу после CREATE...AS. с помощью оператора" SET NOCOUNT ON". Я делаю это много - тогда ваш:

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

Должен вернуть единственный результат набор. Я знаю, что это старо, но, может быть, это кому-то поможет. Это, безусловно, что - то, что повлияло на мое кодирование SQL в прошлые годы-не уверен, если MySQL или Oracle производят подобные проблемы / или имеют подобное исправление.

R White-drive-by contributor