尝试将空数据插入 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 deleteafter 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】:

您的触发器需要能够处理InsertedDeleted 伪表中的多行,因为如果您的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 中的视图中,还有其他方式吗?的主要内容,如果未能解决你的问题,请参考以下文章

你如何将空值插入sql server

通过数据库上下文将空 DataTable 传递给 SQL Server 存储过程

将空值插入 Postgresql

如何将数据插入到sql server中的自引用表中? [复制]

Laravel - 将空值插入数据库

将网格视图中的选中行插入到 yii2 中的表中