Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在存储过程中使用游标向表中插入值,而不获取重复记录?_Sql Server_Sql Server 2005 - Fatal编程技术网

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

Sql server 如何在存储过程中使用游标向表中插入值,而不获取重复记录?,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我正在尝试使用存储过程中的游标,根据from date和to date参数将记录插入现有但为空的表中。请让我知道我在下面的SQL中做错了什么 当执行此过程时,我将第一行复制多次 错误: 超过最大存储过程、函数、触发器或视图嵌套级别(限制32) 代码: 首先-在这种情况下绝对不需要光标。SQL Server是一个基于集合的系统-不要将过程性行通过痛苦的行方法应用于这个基于集合的系统,这种方法在过程性语言中有效!改用基于集合的方法 另外:不要将正确的ANSIjoin语法与旧式的、不推荐使用逗号分隔的

我正在尝试使用存储过程中的游标,根据from date和to date参数将记录插入现有但为空的表中。请让我知道我在下面的SQL中做错了什么

当执行此过程时,我将第一行复制多次

错误:

超过最大存储过程、函数、触发器或视图嵌套级别(限制32)

代码:


首先-在这种情况下绝对不需要光标。SQL Server是一个基于集合的系统-不要将过程性行通过痛苦的行方法应用于这个基于集合的系统,这种方法在过程性语言中有效!改用基于集合的方法

另外:不要将正确的ANSI
join
语法与旧式的、不推荐使用逗号分隔的表列表
join
方法混合使用。20多年前,SQL-92标准已经不再支持这种旧式风格了-是时候将其扔出窗口,并始终使用正确的ISO/ANSI标准
连接
语法(
内部连接,左侧外部连接

因此,基本上,最后,你的陈述应该是:

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

至于避免重复:分别运行
SELECT
查询,看看为什么会出现重复。仅凭这段代码,局外人无法在此提供有意义的答案—这完全取决于表中存储的数据。

我处于培训模式,有人要求我使用游标执行此过程并将数据插入表中。我运行了多次查询,得到了所需的结果,而不是重复的结果。感谢您提到SQL标准,这很有帮助。@user3054170:所以您的
SELECT
可能不会返回重复的数据,但它会返回目标表中已经存在的一行?(因此,最后,在运行
INSERT…SELECT之后,您将在目标表中得到一个副本)否,我面临的问题是,上面的过程将返回单记录重复多个times@user3054170:那么很明显,在某个地方,不知何故,您缺少一个
JOIN
WHERE
条件……是否知道执行上述过程错误时发生此错误的原因:超过了最大存储过程、函数、触发器或视图嵌套级别(限制32)
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