2017-02-21 91 views
0

我有兩個表更新父表計數在SQL Server更新在子表中的記錄

  • 部門(DEPTID(PrimaryKey的),DEPTNAME,empcount)
  • EmployeeInfo( empid(primarykey),名稱,deptid(foreign_key)參考deptid)

當我在EmployeeInfo中更新deptid記錄,立即可以修改計數以適應相應的更改。

子表中的更新將導致父表中的增量和減量。 我知道這可以用一個觸發器來完成,但有使用存儲過程

+0

當然有。你被卡住了什麼? – UnhandledExcepSean

+0

@Ghost我想在更新之前保存deptid,然後在更新之後遞減計數,再次遞增計數。這是乏味的方式 – Advaitha

+1

爲什麼你需要堅持'empcount'呢?你不能只是創建一個視圖來返回這些信息? 'select d.deptid,d.deptname,從Departments d的inner(*)empcount統計d.deptid = e.deptid'的內部聯接EmployeeInfo。這些信息總是正確的,無需在存儲過程或觸發器中編寫任何代碼。此外,存儲過程無法在更新子表時自動運行 - 這就是觸發器的作用。 empcount更新自動發生的唯一方法是在存儲過程中執行EmployeeInfo更新,而不是直接在表中執行。 – Skippy

回答

0

我認爲這是你在找什麼:

CREATE PROCEDURE dbo.UpdateDeptId(
@p_Employee_id int, 
@p_NewDept_id int 
) 
AS 
BEGIN 

UPDATE EmployeeInfo SET deptid = @p_NewDept_id 
WHERE empid = @p_Employee_id 

UPDATE T1 SET T1.EmpCount = T2.CountEmp 
FROM Departments AS T1 INNER JOIN (SELECT deptid , Count(*) as CountEmp FROM EmployeeInfo GROUP BY deptid) AS T2 
ON T1.deptid = T2.deptid 

END 

側面說明:這是不是最好的做法來存儲,總價值IA柱,請嘗試使用視圖或只是運行一個查詢在需要時檢索它

0

恕我直言的方式,總價值應該是靜態列需要更新。

視圖會更好。這可以按需點播。

但是,如果你堅持......這是一個選項....不需要具有存儲過程的nsync-ness。

-- START TSQL 

SET NOCOUNT ON 


IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = N'dbo' and TABLE_NAME = N'Employee' and TABLE_TYPE = N'BASE TABLE') 
BEGIN 
DROP TABLE [dbo].[Employee] 
END 
GO 


IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = N'dbo' and TABLE_NAME = N'Department' and TABLE_TYPE = N'BASE TABLE') 
BEGIN 
DROP TABLE [dbo].[Department] 
END 
GO 


DROP FUNCTION dbo.udfEmployeeCountByDepartment 
GO 



CREATE TABLE [dbo].[Department](
    [DepartmentUUID] [uniqueidentifier] NOT NULL, 
    [TheVersionProperty] [timestamp] NOT NULL, 
    [DepartmentName] [nvarchar](80) NULL, 
    [CreateDate] [datetime] NOT NULL, 
    [MyTinyInt] tinyint not null 
    ) 


ALTER TABLE dbo.[Department] ADD CONSTRAINT PK_Department PRIMARY KEY NONCLUSTERED ([DepartmentUUID]) 
GO 

ALTER TABLE [dbo].[Department] ADD CONSTRAINT CK_DepartmentName_Unique UNIQUE ([DepartmentName]) 
GO 






CREATE TABLE [dbo].[Employee] ( 

    [EmployeeUUID] [uniqueidentifier] NOT NULL, 
    [ParentDepartmentUUID] [uniqueidentifier] NOT NULL, 
    [TheVersionProperty] [timestamp] NOT NULL, 
    [SSN] [nvarchar](11) NOT NULL, 
    [LastName] [varchar](64) NOT NULL, 
    [FirstName] [varchar](64) NOT NULL, 
    [CreateDate] [datetime] NOT NULL, 
    [HireDate] [datetime] NOT NULL 
    ) 

GO 

ALTER TABLE dbo.Employee ADD CONSTRAINT PK_Employee PRIMARY KEY NONCLUSTERED (EmployeeUUID) 
GO 


ALTER TABLE [dbo].[Employee] ADD CONSTRAINT CK_SSN_Unique UNIQUE (SSN) 
GO 

ALTER TABLE [dbo].[Employee] ADD CONSTRAINT FK_EmployeeToDepartment FOREIGN KEY (ParentDepartmentUUID) REFERENCES dbo.Department (DepartmentUUID) 
GO 

CREATE FUNCTION dbo.udfEmployeeCountByDepartment(@DepartmentUUID uniqueidentifier) 
RETURNS int 
AS 
BEGIN 
    DECLARE @returnCount int 
    select @returnCount = count(*) from dbo.Employee e where e.ParentDepartmentUUID = @DepartmentUUID 
    RETURN @returnCount 
END 

GO 



ALTER TABLE [dbo].[Department] ADD [ComputedEmployeeCount] as (dbo.udfEmployeeCountByDepartment(DepartmentUUID)) 

GO 



Select * from dbo.Department 

INSERT [dbo].[Department] (DepartmentUUID , DepartmentName , CreateDate) 
Select NEWID() , 'DepartmentOne', CURRENT_TIMESTAMP 
UNION ALL Select NEWID() , 'DepartmentTwo', CURRENT_TIMESTAMP 
UNION ALL Select NEWID() , 'DepartmentThree', CURRENT_TIMESTAMP 
UNION ALL Select NEWID() , 'DepartmentFour', CURRENT_TIMESTAMP 



INSERT INTO [dbo].[Employee] ( 
    [EmployeeUUID] , 
    [ParentDepartmentUUID] , 
    [SSN] , 
    [LastName] , 
    [FirstName] , 
    [CreateDate], 
    [HireDate] 
    ) 
SELECT NEWID() , (select top 1 DepartmentUUID from dbo.Department order by newid()), '111-11-1111', 'OneLN', 'OneFN', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP 
UNION ALL SELECT NEWID() , (select top 1 DepartmentUUID from dbo.Department order by newid()), '222-22-2222', 'TwoLN', 'TwoFN', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP 
UNION ALL SELECT NEWID() , (select top 1 DepartmentUUID from dbo.Department order by newid()), '333-33-3333', 'ThreeLN', 'ThreeFN', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP 
UNION ALL SELECT NEWID() , (select top 1 DepartmentUUID from dbo.Department order by newid()), '444-44-4444', 'FourLN', 'FourFN', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP 
UNION ALL SELECT NEWID() , (select top 1 DepartmentUUID from dbo.Department order by newid()), '555-55-5555', 'FiveLN', 'FiveFN', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP 
UNION ALL SELECT NEWID() , (select top 1 DepartmentUUID from dbo.Department order by newid()), '666-66-6666', 'SixLN', 'SixFN', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP 
UNION ALL SELECT NEWID() , (select top 1 DepartmentUUID from dbo.Department order by newid()), '777-77-7777', 'SevenLN', 'SevenFN', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP 
UNION ALL SELECT NEWID() , (select top 1 DepartmentUUID from dbo.Department order by newid()), '888-88-8888', 'EightLN', 'EightFN', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP 
UNION ALL SELECT NEWID() , (select top 1 DepartmentUUID from dbo.Department order by newid()), '999-99-9999', 'NineLN', 'NineFN', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP 


Select * from dbo.Department