簡體   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