如何在存储过程中使用游标将值插入表而不获取重复记录?

时间:2013-12-01 10:50:07

标签: sql-server sql-server-2005

我正在尝试使用存储过程中的游标,根据日期和日期参数将记录插入到现有但空的表中。请告诉我在下面的SQL中我做错了什么?

执行此程序时,我会多次复制第一行。

错误:

  

超出最大存储过程,函数,触发器或视图嵌套级别(limit32)

代码:

ALTER proc [dbo].[spempmaster] (@date1 datetime,@date2 datetime)
as
Begin

    Set nocount on

    declare @doj datetime
    declare @empname nchar(10)
    declare @managername nchar(10)
    declare @dept varchar(50)  
    declare emp_report15 cursor for

    select convert(varchar(10),convert(smalldatetime,emp.doj,120),103) DOJ, 
    (emp.name + ' ' + emp.lastname)  Name,
    emp1.name Manager_Name, txtdepartment Department
    from empmaster emp
    left outer join tbljobtitles jt 
        on emp.fkjobtitleid = jt.pkjobtitleid,
    tbldepartment td, 
    tblteam t,
    empmaster emp1
    where
        jt.fkteamid = t.pkteamid
        and td.pkdeptid= t.fkdeptid
        and emp.reportingto = emp1.empno
        and emp.doj between @date1 and @date2
    order by doj

    open emp_report15

    fetch emp_report15 into @doj, @empname, @managername, @dept

    while @@fetch_status = 0
    begin
        insert into tblreport (DOJ,emp_name,manager_name,department)
        values(@doj,@empname,@managername,@dept)
    end

    fetch next from emp_report15 into @doj,@empname,@managername,@dept

    close emp_report15

    deallocate emp_report15

end

1 个答案:

答案 0 :(得分:2)

首先 - 在这种情况下,游标绝对不需要。 SQL Server是一个基于集合的系统 - 不要将过程语言中使用的程序性 row-by-agonizing-row 方法应用于这个基于集合的系统!改为使用基于集合的方法!

另外:不要将正确的ANSI join语法与旧式的,已弃用的逗号分隔的表 JOIN方法列表混合使用。旧的风格已被 SQL-92 标准弃用 - 超过 20年前! - 关于时间将其抛到窗外并使用正确的ISO / ANSI标准<{1}}语法JOIN)。

所以基本上,最后 - 你的陈述是这样的:

INNER JOIN, LEFT OUTER JOIN

至于避免重复:分别运行ALTER PROCEDURE [dbo].[spempmaster] (@date1 DATETIME, @date2 DATETIME) AS INSERT INTO dbo.tblreport(DOJ, emp_name, manager_name, department) SELECT CONVERT(VARCHAR(10), CONVERT(SMALLDATETIME, emp.doj, 120), 103), (emp.name + ' ' + emp.lastname), emp1.name Manager_Name, txtDepartment FROM dbo.empmaster emp INNER JOIN dbo.empmaster emp1 ON emp.reportingto = emp1.empno LEFT OUTER JOIN dbo.tbljobtitles jt ON emp.fkjobtitleid = jt.pkjobtitleid LEFT OUTER JOIN dbo.tblteam t ON jt.fkteamid = t.pkteamid LEFT OUTER JOIN dbo.tbldepartment td ON td.pkdeptid = t.fkdeptid WHERE emp.doj BETWEEN @date1 AND @date2 查询,看看你为什么要重复。仅从这些代码来看,外人无法在这里提供有意义的答案 - 这完全取决于表中存储的数据。