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