0

メール送信を処理するメール キューを作成しています。そのキューから X 個のレコードを取得し、レコードのタイプ フィールドに従ってメールを送信します。

そのために、ストアド プロシージャ内でテーブルを宣言しました。X 件のレコードが取得されると、 EmailQ テーブルのレコードのステータスが処理中になります。しかし、宣言されたテーブル内にあるX個のレコードを送信した後、削除する必要があります

そのために Delete を使用できますが、このTRUNCATE を使用してテーブル内のすべてのレコードを削除します。しかし、宣言されたテーブルはテーブルとして識別されていません。

WHILE EXISTS ( SELECT * FROM emailQ WHERE Status != 3)
BEGIN
  CREATE PROCEDURE [dbo].[SendMails]
  DECLARE @Temp TABLE (......)
  --Declare all the necessary variables

  INSERT INTO @Temp SELECT TOP 10
  WITH (UPDLOCK, HOLDLOCK)

  --Update the email queue table status of selected set of records in to the @Temp

  DECLARE  dataSet CURSOR FORWARD_ONLY FOR (SELECT.......  FROM @Temp)
  OPEN dataSet
  FETCH NEXT FROM dataSet INTO...

  WHILE @@FETCH_STATUS = 0
  BEGIN
    --send mails acordingly
  END

  CLOSE dataSet
  DEALLOCATE dataSet

  --Update the email queue table status of completed set of records in to the @Temp

  WAITFOR DELAY...
  TRUNCATE @Temp// This is where this Temp table is not identified as a table(It says     "Incorrect sintax... Expecting a table")

 END

この宣言されたテーブルからレコードを削除する最も適切な方法は何ですか? また、メール送信の処理方法に関するコメントもありがとうございます。

ありがとう。

4

2 に答える 2

12

あなたは削除でそれを行う必要があります

DELETE FROM @Temp

関連する質問を確認する

SQL Server、切り捨てを伴う一時テーブル vs 削除を伴うテーブル変数

切り捨てテーブルと一時テーブルの詳細

テーブルの切り捨て

#temp テーブルまたは @table 変数を使用する必要がありますか?

アップデート:

テーブルの切り捨ては、宣言されたテーブル変数では機能しません。代わりに #Temp テーブルを使用するか、トランケートする代わりに行を削除する必要があります。詳細については、関連する質問を確認してください。

更新 2:

マーティン・スミスによるすばらしい答え

SQL Server の一時テーブルとテーブル変数の違いは何ですか?

于 2012-08-30T06:02:42.047 に答える