【问题标题】:Microsoft Access - stored procedure with cursorMicrosoft Access - 带游标的存储过程
【发布时间】:2015-02-13 15:11:37
【问题描述】:

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

此存储过程使用游标。

我尝试通过将“CREATE PROCEDURE”替换为“CREATE PROC”来在 Microsoft Access 中创建相同的存储过程,但它似乎不起作用。

谁能提供一些解决方法?

这是 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

【问题讨论】:

  • 删除重复项是您只需要做一次,还是必须是一项重复性任务?
  • 在访问中 loginfo 是本机表而不是链接。我不需要定期删除重复项。只是偶尔一次。现在我正在研究另一个项目,一旦我再次开始工作,我会征求你的意见。你一直很有帮助。非常感谢!

标签: ms-access stored-procedures


【解决方案1】:

从 Jet 4 (Access 2000) 开始,当您从 ADO 执行 DDL 语句时,Access DDL 包括对 CREATE PROCEDURE 的支持。但是,与您根据 SQL Server 经验所期望的相比,这些“过程”是有限的。它们只能包含一个 SQL 语句,并且没有过程类型代码。基本上,Access 存储过程与保存的查询相同,因此受到相同的限制,包括 Access 的数据库引擎不使用 T-SQL 的事实。

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

  1. 在 SQL Server 上运行存储过程以删除重复项。
  2. 创建唯一约束以防止在 loginfo 表中出现新的 empid/dtpunched 对重复。
  3. 在您的 Access 应用程序中,创建指向 SQL Server loginfo 表的链接。

但是,我不知道该建议是否适合您的情况。如果您向我们提供更多信息以供我们使用,您很可能会得到更好的答案。

【讨论】:

  • 谢谢你!我正在处理那些将数据从访问权限转移到 sqlserver 的行,运行存储过程,然后将 sql 表链接到访问数据库
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多