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 ответа:
Вам нужно вот что:
<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