繁体   English   中英

数据库中已经存在名为'name'的object - 存储过程错误 - SQL 服务器

[英]There is already an object named 'name' in the database - stored procedure error - SQL Server

我的 SQL 服务器数据库中有两个名为timeususdpay的表。 这两个表每周更新一次。

我做了一些小的改造,将这两个表组合起来,创建了一个名为fluslabor的新表。

我使用此处显示的存储过程创建了fluslabor ,它正在运行:

CREATE PROCEDURE [dbo].[sp_uslabor]
AS
BEGIN
    SET NOCOUNT ON

    IF OBJECT_ID(N'dbo.fluslabor', N'U') IS NOT NULL
        TRUNCATE TABLE [dbo].[fluslabor];

    SELECT ut.employee_code
            ,ut.employee_name
            ,ut.department_desc
            ,ut.location_desc
            ,ut.hour 
            ,ut.projects_code
            ,ut.in_effective_time
            ,ut.out_effective_time
            ,ut.date
            ,ut.id  
            ,p.rate
            ,(p.rate * ut.hour ) as Labour_Cost
    INTO fluslabor
    FROM timeus ut
    LEFT JOIN usdpay p ON (TRIM(ut.id) = TRIM(p.id) AND ut.date = p.date)
    WHERE ut.projects_code NOT LIKE '0%'
END

今天我在我的两个表timeususdpay中更新了新数据。

当我执行存储过程时,SQL 服务器抛出此错误:

消息 2714,级别 16,State 6,过程 SP_uslabor,第 12 行 [批启动第 38 行]
数据库中已经有一个名为“fluslabor”的 object。

我每次都需要截断表并加载新数据。 我检查了类似的帖子,他们说要使用 drop table 选项。 我不想删除表,只想截断并执行程序

谁能告诉我这里的问题是什么?

这里的问题是fluslabor表已经存在于数据库中。 您在插入上方尝试的是检查 object 是否存在,然后截断相同的内容

您可以在此处尝试两种可能的方法。

  1. 相反,如果TRUNCATE执行DROP TABLE 但是,如果您已向任何用户提供对表的特定自定义访问权限,这也将删除表上的现有用户权限

    IF OBJECT_ID(N'dbo.fluslabor', N'U') IS NOT NULL DROP TABLE [dbo].[fluslabor];

  2. 最安全的方法是更改SELECT.. INTO语句并将其转换为INSERT INTO像这样

    INSERT INTO fluslabor ( <List your Destination columns> ) SELECT <List your Source columns> FROM <Source Query>

第二种方法将加载记录并保留所有现有权限

IF EXISTS (SELECT 1 FROM sys.objects WHERE type = 'P' AND name = 'your SP name')
BEGIN
    DROP PROCEDURE "your SP name";
END
GO
CREATE PROCEDURE "your SP name"

AS
BEGIN
.
.
.
.

试试这个我想这会对你有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM