2

私はColdfusion9とSQLServer2008を使用しています。プラットフォームを学び、レポートソリューションに両方のプラットフォームを効果的に活用する方法を実際に学ぼうとしています。ストアドプロシージャ、つまりsprocでいくつかの大きな課題がありました。私が欲しいのは、sprocをCFMLで活用して、それを必要とする人々にデータを取得できるようにするための非常に簡単な答えです。

オンラインで調査を行ったところ、SQL Server 2008は、RAM(@)に配置されているか、ローカルユーザー(#)のディスクに書き込まれている一時テーブルを利用しているようです。私の問題は、生成された一時テーブルがプロセス呼び出しからColdFusionにデータを返すように見えないことですが、SQL Serverの一時テーブルに追加されるSQLクエリの部分を実行すると、魅力。簡単なテーブルをColdFusionに返し、これを可能な限り最も効率的な方法でコーディングしていることを確認するだけです。

私は試しました:-Returnステートメントを使用しましたが、これはRAMテーブル(@)で構文エラーを生成するようです。-永続的な一時テーブルの使用(#)-さまざまなオンラインフォーラムがこれを使用すると考えているようですが、アプリケーションはこれを行うことでパフォーマンスに大きな打撃を与えます。(誰もが批評家です。)

私の目標は次のとおりです。-このプロセスを学習し、可能な限り再利用できるようにする-クエリが可能な限り実行されるように、これを行う正しい方法を学習します。-SPROCSで(@)および(#)一時テーブルを使用する状況とその理由を理解します。永続的な一時テーブル(#)は、コンパイル中に起動された他のsprocのためにRAMを解放するので優れていると考える人もいれば、サーバーをハードディスクに移動させてデータを書き込むのは遅いと考える人もいます。-以下の構文が機能しない理由を理解する

現在、私の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>

そして、私のSQLServerコードは次のようになります。

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

試す:

 <cfprocparam cfsqltype="INT" dbvarname="@SDate" value="2004">
 <cfprocparam cfsqltype="INT" dbvarname="@EDate" value="2005">
于 2012-07-10T21:11:30.627 に答える
1
--ものをRAMテーブルに入れます
--///コメント///(これは、影響を受けるレコード数を含むADOaccessibelオブジェクトで構成される最初の結果セットを実際に返します*RW)
     INSERT INTO @DonationCountTable(donationKey、CompanyKey、SenatorKey、donationAmount、donationDateFY)
     SELECT * FROM PoliticalDontations
     @SDateと@EDateの間のdonationDateFYの場所
     注文者donationDateFY、CompanyKey ASC

私が言いたかったのは、ストアドプロシージャで時々陥る罠は、多くのコマンドがレコードセットオブジェクトになるということです(この例ではINSERT ... SELECTが行います)。これらのレコードセットがすべて必要ではないのではないかと思います。または、少なくとも適切なものを選択するために使用する必要があります。

これを回避する1つの方法は、CREATE...ASの直後に開始することです。「SETNOCOUNTON」ステートメントを使用します。私はそれをたくさんします-そしてあなたの:

        --RAMテーブルからデータを取り出します
       SELECT * FROM @DonationCountTable  

唯一の結果セットを返す必要があります。私はこれが古いことを知っています、しかし多分それは誰かを助けます。これは確かに過去数年で私のSQLコーディングに影響を与えたものです-MySQLまたはOracleが同様の問題を生成するかどうか/または同様の修正があるかどうかはわかりません。

Rホワイト-ドライブバイ寄稿者

于 2012-08-02T19:05:28.313 に答える