2012-01-28 52 views
1

我在SQL Server中有一個存儲過程,用於從其中一個表中刪除重複項。Microsoft Access - 使用光標存儲過程

此存儲過程使用遊標。

我試圖通過用'CREATE PROC'替換'CREATE PROCEDURE'來創建相同的存儲過程,但它似乎沒有工作。

任何人都可以提供一些解決方法嗎?

這裏是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 [email protected] and [email protected] and row_id<>@minrowid 
     fetch next from curduplicate into @empid,@dtpunched,@count,@minrowid 

    end 
close curDuplicate 
deallocate curDuplicate 
END 
+0

正在刪除重複的東西,你只需要做一次,或者它必須是一個循環任務? – HansUp 2012-01-28 19:05:05

+0

在訪問loginfo是一個本地表而不是鏈接。我不需要定期刪除重複。偶爾有一次。現在我正在研究另一個項目,一旦我開始再次研究這個問題,我會尋求你的建議。你一直很有幫助。非常感謝 ! – 2012-01-30 10:37:23

回答

1

與Jet 4(訪問2000年)開始,訪問DDL包括當您從ADO執行DDL語句CREATE PROCEDURE支持。但是,與您基於SQL Server體驗所預期的相比,這些「過程」是有限的。它們只能包含一條SQL語句,而不包含過程類型代碼。 Access存儲過程基本上與保存的查詢相同,因此受到相同的限制,其中包括Access的數據庫引擎不會說T-SQL這一事實。

至於解決方法,您可以創建一個Access兼容的DELETE語句來刪除重複項。但我會首先尋找「可能有效的最簡單的東西」。

  1. 在SQL Server上運行您的存儲過程以刪除重複項。
  2. 創建一個唯一約束來防止loginfo表中empid/dtpunched對的新重複。
  3. 在您的Access應用程序中,創建指向SQL Server loginfo表的鏈接。

但是,我不知道這個建議是否適合您的情況。如果您向我們提供更多信息,那麼您很可能會得到更好的答案。

+0

謝謝hansup!我正在研究將數據從訪問移動到sqlserver,運行存儲過程,然後將sql錶鏈接到訪問數據庫的工作 – 2012-01-29 06:27:36