【发布时间】:2016-05-10 02:59:30
【问题描述】:
让我解释一下我的情况。我有 3 个使用
生成的表CREATE TABLE Partners
(
id INT IDENTITY(1,1),
name NVARCHAR(50) NOT NULL,
PRIMARY KEY (id)
);
-- snip ...
CREATE TABLE Questions
(
id INT IDENTITY(1,1),
section_id INT,
qtext NVARCHAR(300) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (section_id) REFERENCES Sections(id) ON DELETE CASCADE
);
-- snip ...
CREATE TABLE Answers
(
id INT IDENTITY (1,1),
question_id INT,
partner_id INT,
val DECIMAL DEFAULT 0.0,
PRIMARY KEY (id),
FOREIGN KEY (question_id) REFERENCES Questions(id) ON DELETE CASCADE,
FOREIGN KEY (partner_id) REFERENCES Partners(id) ON DELETE CASCADE
);
我正在尝试设置一个触发器,以便在添加新合作伙伴时,为每个问题生成默认答案。
我尝试创建该触发器是
-- Create trigger so that adding a partner results in default
-- answers for every survey
-- See https://stackoverflow.com/questions/11852782/t-sql-loop-over-query-results
CREATE TRIGGER DefaultAnswers
ON Partners
AFTER INSERT
AS
BEGIN
CREATE TABLE QuestIds (RowNum INT, Id INT);
INSERT INTO QuestIds (RowNum, Id)
SELECT DISTINCT ROW_NUMBER() OVER (ORDER BY Id) as RowNum, Id
FROM TABLE
DECLARE @id INT
DECLARE @totalrows INT = (SELECT COUNT(*) FROM QuestIds)
DECLARE @currentrow INT = 1
WHILE @currentrow < @totalrows
BEGIN
SET @id = (SELECT Id FROM QuestIds WHERE RowNum = @currentrow)
EXEC AddAnswerWithoutVal @question_id=@id, @partner_id=INSERTED.id
SET @currentrow = @currentrow +1
END
END
错误是
消息 156,级别 15,状态 1,过程 DefaultAnswers,第 313 行
关键字“TABLE”附近的语法不正确。消息 102,级别 15,状态 1,过程 DefaultAnswers,第 323 行
'.' 附近的语法不正确。
你能帮我找出问题吗? INSERTED,我想,是指刚刚插入表格的行。至于FROM TABLE,那也是我试图从T-SQL loop over query results 中窃取的东西。
编辑:我还有一个问题。当我开始工作时,触发器会引用 成功 插入的行吗?我想确保这是一个原子操作。
【问题讨论】:
-
inserted是一个表格。您需要使用游标或其他循环构造来将来自inserted的值用于存储过程。 -
插入触发器仅在成功插入行后运行。这是第二个问题的答案。
标签: sql sql-server tsql database-design