我在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
其中Notifications
为0
,1
,2
或3
其中
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
表中的列是动态的