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,带有截断的临时表与带有删除的表变量

更多关于截断和临时表

截断表

我应该使用#temp 表还是@table 变量?

更新:

截断表不适用于声明的表变量。您应该改用 #Temp 表或删除行而不是 trancating。检查相关问题以获取更多信息。

更新 2:

马丁史密斯的好回答

SQL Server 中的临时表和表变量有什么区别?

于 2012-08-30T06:02:42.047 回答
0

创建表如下..

DECLARE @tempTable table(BatchId int, BatchInputOutputType NVARCHAR(128));

使用以下查询删除临时表

DELETE from @tempTable;
于 2016-03-25T11:41:27.847 回答