【问题标题】:Trying to insert null data into a view in SQL, any other way?尝试将空数据插入 SQL 中的视图中,还有其他方式吗?
【发布时间】: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
  • 这是你需要的吗?在检测到它是插入还是删除后,您可以进行插入。
  • 您无需发送电子邮件即可加入聊天室

标签: sql-server database view null


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 2013-09-20
      • 2023-02-20
      • 2021-09-19
      相关资源
      最近更新 更多