2012-10-03 41 views
1

我想要做的是使用执行T-SQL语句任务通过维护计划自动执行下面的存储过程。我所看到的是,当此过程作为维护计划的一部分运行时,出于某种原因,添加的记录加倍,就像INSERT语句运行两次一样。这是kicker,当它通过Management Studio手动执行时,它会按预期方式运行,并且我得到一组添加到表中的记录。使用TRUNCATE TABLE作为解决方案似乎解决了这个问题,但是当准备数据库进行SQL镜像时,我将回到原点。奇怪的SQL Server行为

有没有人见过这种行为?另外,为了好奇,重建索引的100%填充因子是有意的,因为该表上唯一发生的I/O是以下过程。

ALTER PROCEDURE [dbo].[usp_Populate_SearchTable] 
AS 
BEGIN 
    UPDATE ut_Update_Status SET [status] = 1, lastUpdate = getdate(); 

    DELETE FROM ut_Permit_Lookup; 
    DBCC CHECKIDENT ('dbo.ut_Permit_Lookup', RESEED, 0); 
    -- OR 
    --TRUNCATE TABLE ut_Permit_Lookup; 

    INSERT INTO ut_Permit_Lookup (
     NUMBER_KEY, 
     ADDR_FRACTION, 
     PARCEL_NO, 
     TYPE_TITLE, 
     TypDesc, 
     SUB_TYPE, 
     Location, 
     [DESCRIPTION], 
     DATE_A, 
     DATA_STATUS 
    ) 
    SELECT a.NUMBER_KEY, 
     a.ADDR_FRACTION, 
     a.PARCEL_NO, 
     a.TYPE_TITLE, 
     a.TypDesc, 
     a.SUB_TYPE, 
     a.Location, 
     SUBSTRING(a.[DESCRIPTION], 1, 275), 
     a.DATE_A, 
     a.DATA_STATUS 
    FROM PERMPLUS.dbo.vw_Permit_WebLookup as a 
    WHERE a.TYPE_CAT = 'BLDG' 
     AND a.DATA_LEVEL = 'A' 
     AND (a.CLASS <> 'NA' OR a.CLASS IS NULL); 

    DBCC DBREINDEX ('dbo.ut_Permit_Lookup', idx_SearchIndex, 100); 
    UPDATE ut_Update_Status SET [status] = 0; 
END 
+1

您是否尝试过运行轨迹? –

+0

跟踪它之后,它显示DELETE和INSERT语句两次启动并完成一次。这证实了双倍的记录,但我仍然失去原因。 – Tehrab

+0

你如何在执行任务中调用过程?你说它是作为维护计划的一部分运行的,那么这是否意味着其他对象/任务在这项任务的成功或失败中运行? –

回答

0

嗯,我想放一个正式的答案,我会建议...

我从来没有听说过这个问题。我遇到的维修计划虽然与您所使用的维修计划不尽相同,但是由于SSMS的维修计划比我正在进行的实例要低。您没有说明您正在使用的SQL的构建版本,但是如果它是SQL 2008或更高版本,则可以在http://connect.microsoft.com/sqlserver上提交连接项目。

我可能会使用的唯一选择是只调度SQL代理作业的过程调用,看看你是否得到相同的结果。我希望SQL代理作业会给出与在查询窗口中从SSMS调用它相同的结果。