0

最近、私は新しいASP Webアプリケーションを継承しました。このアプリケーションでは、顧客が未払いの請求書をオンラインで支払うだけで済みます。アプリケーションの設計が不十分で、支払い履歴テーブルがありませんでした。支払いテーブル全体が、支払いレコードを記録の会計システムに転送するWebサービスによって削除されました。

PaymentsテーブルにデータをPayment_Logテーブルにコピーするだけの単純なトリガーを作成しました。最初は、トリガーはデータをコピーするために挿入時にselect*を実行しました。ただし、顧客の1人がデバッグする必要のある問題を抱えているため、トリガーを変更して支払いの日付をPayment_Logテーブルに挿入しました。新しいトリガーは以下のとおりです。私の質問は、この新しいバージョンのトリガーでは、行がテーブルの中央に挿入されていることに気付いたということです(つまり、最後ではありません)。誰かがこれが起こっている理由を説明できますか?

ALTER trigger [dbo].[PaymentHistory] on [dbo].[Payments]
for insert as

Declare @InvoiceNo nvarchar(255),
    @CustomerName nvarchar(255),
    @PaymentAmount float,
    @PaymentRefNumber nvarchar(255),
    @BulkPaid bit,
    @PaymentType nvarchar(255),
    @PaymentDate datetime

Select @InvoiceNo = InvoiceNo,
   @CustomerName = CustomerName,
   @PaymentAmount = PaymentAmount,
   @PaymentRefNumber = PaymentRefNumber,
   @BulkPaid = BulkPaid,
   @PaymentType = PaymentType
from inserted

Set @PaymentDate = GETDATE()

Insert into Payment_Log 
values (@InvoiceNo, @CustomerName, @PaymentAmount, @PaymentRefNumber, @BulkPaid, @PaymentType, @PaymentDate)

以下は、テーブルデータの中央に挿入されている行を示すSQL ServerManagementStudioのスクリーンショットです。助けてくれてありがとう。

ここに画像の説明を入力してください

4

2 に答える 2

5

データセットには順序がありません。これは、毎回異なる順序で結果を返すことSELECT * FROM x ができることを意味します。

データが同じ順序で返されることが保証されるのは、句を指定するときだけですORDER BY


とはいえ、通常、データが特定の順序で返される状況があります。最も目立つのは、クラスター化されたインデックスです。

これは、2つのテーブルに主キーがあるかどうか疑問に思います。各テーブルのすべてのインデックスを確認し、少なくとも主キーを適用します。


余談ですが、SQL Serverのトリガーは、行ごとではなく、バッチごとに起動されます。これは、insertedテーブルに複数の行を含めることができることを意味する場合があります。 (たとえば、テストデータを一括挿入する場合、またはトランザクションの大規模なバッチを再ロードする場合。)

このため、データを変数にコピーすることは標準的な方法ではありません。代わりに、次のことを行うことができます...

ALTER trigger [dbo].[PaymentHistory] on [dbo].[Payments]
for insert as

INSERT INTO
  Payment_Log
SELECT
  InvoiceNo, CustomerName, PaymentAmount, PaymentRefNumber,
  BulkPaid,  PaymentType,  GetDate()
FROM
  inserted
于 2012-08-13T14:51:53.990 に答える
-1

OKこの質問は、SQLクエリでorder by句を使用しないのに、なぜ行が異なる順序で返されるのかと同じ答えです。SQLに何らかの方法で行を処理するように依頼すると、可能な限り最速の方法で行が処理されます。最初にキャッシュされた行、次にハードドライブの読み取りヘッドに最も近い行、最後に残りの行です。

別の言い方をすれば、クエリが順番に行を使用する場合、先着順の場合よりも10倍長くかかると煩わしくなります。SQLは、要求された内容を可能な限り迅速に実行します

お役に立てれば

于 2012-08-13T14:47:26.023 に答える