尝试将空数据插入 SQL 中的视图中,还有其他方式吗?
Posted
技术标签:
【中文标题】尝试将空数据插入 SQL 中的视图中,还有其他方式吗?【英文标题】:Trying to insert null data into a view in SQL, any other way? 【发布时间】:2017-02-18 05:45:26 【问题描述】:第 1 部分视图 1-1) 创建一个名为 VDept_Headcount 的视图,用于报告每个部门的人数。 该报告包括以下 3 列: Dept_Name、Dept_Number、No_Emp。 包括所有部门。 通过SQL显示视图的内容(Select * from VDept_Headcount;)
USE COMPANY
GO
--1-1) Create a view named VDept_Headcount that reports headcount for each department.
CREATE VIEW VDept_Headcount(Dept_Name, Dept_Number, No_Emp)
AS
SELECT d.DNAME, d.DNUMBER, COUNT(e.DNO)
FROM DEPARTMENT d LEFT OUTER JOIN EMPLOYEE e ON e.DNO = d.DNUMBER
GROUP BY d.DNAME, d.DNUMBER;
GO
SELECT *
FROM VDept_Headcount;
USE COMPANY
GO
--Add yourself into Employee
INSERT INTO EMPLOYEE
VALUES('Dan', NULL, 'Chan', '122345687', '13-Nov-1948', '323 Williams Ct, Columbus, OH', 'M', 55000, '987654321', 5);
SELECT *
FROM VDept_Headcount;
我的问题是,如果我想重新添加内容,是否有不同的方法来替换空值?我可以使用空白值吗?
【问题讨论】:
好像你需要一个触发器,after delete
和 after update
这是你需要的吗?在检测到它是插入还是删除后,您可以进行插入。
您无需发送电子邮件即可加入聊天室
【参考方案1】:
您应该检测它是 INSERT
还是 DELETE
,试试这个:
CREATE TRIGGER AuditEmp_Trigger
ON YOUR_TABLE
AFTER INSERT , DELETE
AS
if (SELECT COUNT(*) FROM INSERTED ) > 0 AND (SELECT COUNT(*) FROM DELETED) =0
BEGIN
INSERT INTO destination_table SELECT * FROM INSERTED;
END
if (SELECT COUNT(*) FROM INSERTED ) = 0 AND (SELECT COUNT(*) FROM DELETED) >0
BEGIN
INSERT INTO destination_table SELECT * FROM DELETED;
END
GO
如果您只需要检查columns updated
,您可以使用COLUMNS_UPDATED ()
【讨论】:
【参考方案2】:您的触发器需要能够处理Inserted
和Deleted
伪表中的多行,因为如果您的UPDATE
语句影响10 行,则触发器称为 ONCE,但这些伪表每个包含 10 行。您不能只尝试从这些表中“选择”值 - 您会得到任意行,而所有其他行都将被忽略且不处理。
您需要以基于集合的方式编写触发器,对于UPDATE
,在主键上连接两个伪表它们附加到的表:
CREATE TRIGGER dbo.EMPLOYEE_FKDno_UPDATE
ON dbo.DEPARTMENT FOR UPDATE
AS
BEGIN
INSERT INTO dbo.Audit_Emp_Record (date_of_change, old_Lname, new_Lname, old_dno, new_dno, old_ssn, new_ssn)
SELECT
GETDATE(), d.Name, i.Name, d.Number, i.Number, d.Mgr_Ssn, i.Mgr_Ssn
FROM
Inserted i
INNER JOIN
Deleted d ON i.PrimaryKey = d.PrimaryKey
在DELETE
的情况下,您将只有带有“旧”值的Deleted
表 - 所以您需要这样的东西:
CREATE TRIGGER dbo.EMPLOYEE_FKDno_DELETE
ON dbo.DEPARTMENT FOR DELETE
AS
BEGIN
INSERT INTO dbo.Audit_Emp_Record (date_of_change, old_Lname, new_Lname, old_dno, new_dno, old_ssn, new_ssn)
SELECT
GETDATE(), d.Name, NULL, d.Number, NULL, d.Mgr_Ssn, NULL
FROM
Deleted d
如果是 INSERT
,您将只拥有带有新值的 Inserted
表 - 所以您需要这样的东西:
CREATE TRIGGER dbo.EMPLOYEE_FKDno_DELETE
ON dbo.DEPARTMENT FOR DELETE
AS
BEGIN
INSERT INTO dbo.Audit_Emp_Record (date_of_change, old_Lname, new_Lname, old_dno, new_dno, old_ssn, new_ssn)
SELECT
GETDATE(), NULL, i.Name, NULL, i.Number, NULL, i.Mgr_Ssn
FROM
Inserted i
【讨论】:
以上是关于尝试将空数据插入 SQL 中的视图中,还有其他方式吗?的主要内容,如果未能解决你的问题,请参考以下文章
通过数据库上下文将空 DataTable 传递给 SQL Server 存储过程