SQL Server:从插入的表

时间:2016-01-20 23:50:56

标签: sql-server tsql triggers

我在SQL Server中有2个表。第一个是Grades,第二个是Tokens

Grades包含以下列:

Token, SubjectID, SubjectName, ...

点代表多个列。这是动态表,所以它可能如下所示:

Token, SubjectID, SubjectName, LAB_grade, LECTURE_grade 

并且在f.e.之后1分钟,它看起来像这样:

Token, SubjectID, SubjectName, LAB_grade, LECTURE_grade, TEST_grade, SEM_grade 

Tokens表格如下:

access_token, access_token_secret, user_login, Notifications, phone_number, email

其中Notifications0123其中

  • 0表示无所事事
  • 1表示发送电子邮件通知,
  • 2发送短信通知,
  • 3发送两个通知

为了做到这一点,我创建了一个简单的触发器和程序。

CREATE PROCEDURE send_email
      (@email nvarchar(100), @access_token nvarchar(200), @newRow nvarchar(500))
AS
BEGIN
    PRINT 'EMAIL:' + @email + ', TOKEN: ' + @access_token + ', NEW ROW: ' + @newRow
END
GO

CREATE PROCEDURE send_email_sms
     (@phone nvarchar(20), @email nvarchar(100), @access_token nvarchar(200), @newRow nvarchar(500))
AS
BEGIN
    PRINT '(send_email_sms) PHONE_NR: ' + @phone+ ', EMAIL:' + @email + ', TOKEN: ' + @access_token + ', NEW ROW: ' + @newRow
END
GO

CREATE PROCEDURE send_sms
    (@phone nvarchar(20), @email nvarchar(100), @access_token nvarchar(200), @newRow nvarchar(500))
AS
BEGIN
    PRINT '(send_sms) PHONE_NR: ' + @phone + ', EMAIL:' + @email + ', TOKEN: ' + @access_token + ', NEW ROW: ' + @newRow
END
GO

CREATE TRIGGER insertToGrades ON Grades
AFTER INSERT
AS
BEGIN
    DECLARE @newRow nvarchar(500)

    SET @newRow = (SELECT * FROM inserted)

    DECLARE @access_token nvarchar(200)
    SET @access_token = (SELECT Token FROM inserted)

    DECLARE @type_of_notification nvarchar(2)
    SET @type_of_notification = (SELECT Notifications FROM Tokens WHERE access_token = @access_token)

    DECLARE @phone nvarchar(20)
    SET @phone = (SELECT phone_number FROM Tokens WHERE access_token = @access_token)

    DECLARE @email nvarchar(100)
    SET @email = (SELECT email FROM Tokens WHERE access_token = @access_token)

    IF(@type_of_notification = 0)
        return

    IF(@type_of_notification = 1)
    BEGIN
        EXEC dbo.send_email @email, @access_token, @newRow
    END

    IF(@type_of_notification = 2)
    BEGIN
        EXEC dbo.send_sms @phone, @email, @access_token, @newRow
    END

    IF(@type_of_notification = 3)
    BEGIN
        EXEC dbo.send_email_sms @phone, @email, @access_token, @newRow
    END
END

此行存在问题:

SET @newRow = (SELECT * FROM inserted)

因为:

  

当EXISTS没有引入子查询时,只能在选择列表中指定一个表达式。

我是否有可能获得inserted表中的行并将其放入f.e之类的变量中。 @newRow(为了将其传递给适当的程序)?我无法使用引用特定列名的语法,因为Grades表中的列是动态的

0 个答案:

没有答案