Microsoft Access - 带游标的存储过程

时间:2012-01-28 12:53:09

标签: ms-access stored-procedures

我在SQL Server中有一个存储过程,用于从其中一个表中删除重复项。

此存储过程使用游标。

我试图在Microsoft Access中创建相同的存储过程,只需将'CREATE PROCEDURE'替换为'CREATE PROC',但它似乎不起作用。

任何人都可以提供一些解决方法吗?

这是SQL Server存储过程:

ALTER PROCEDURE [dbo].[csp_loginfo_duplicates] 
AS
BEGIN

    SET NOCOUNT ON;


declare @minrowid bigint
declare @empid nvarchar(15)
declare @dtpunched datetime
declare @count tinyint

declare curDuplicate cursor for
    select empid,dtpunched,count(*),min(row_id) from loginfo
    group by empid,dtpunched
    having count(*)>1

open curDuplicate

fetch next from curduplicate into @empid,@dtpunched,@count,@minrowid

while (@@fetch_status=0)
    begin
        delete from loginfo where empid=@empid and dtpunched=@dtpunched and row_id<>@minrowid
        fetch next from curduplicate into @empid,@dtpunched,@count,@minrowid

    end
close curDuplicate
deallocate curDuplicate
END

1 个答案:

答案 0 :(得分:1)

从Jet 4(Access 2000)开始,当您从ADO执行DDL语句时,Access DDL包括对CREATE PROCEDURE的支持。但是,与基于SQL Server体验的预期相比,这些“过程”是有限的。它们只能包含一个SQL语句,而不包含过程类型代码。基本上,Access存储过程与保存的查询相同,因此受到相同的限制,包括Access的db引擎不会说T-SQL。

对于变通方法,您可以创建与Access兼容的DELETE语句来删除重复项。但我首先会寻找“可能有效的最简单的东西”。

  1. 在SQL Server上运行存储过程以删除重复项。
  2. 创建一个唯一约束,以防止loginfo表中的empid / dtpunched对重复出现。
  3. 在Access应用程序中,创建指向SQL Server loginfo表的链接。
  4. 但是,我不知道这个建议是否适合你的情况。如果您向我们提供更多信息,您可能会得到更好的答案。