美好的一天
我们所要做的就是在触发器内部,确保用户没有插入两个名单中“单独”的费用。这些费用需要单独处理。
出于某种原因,它出现在两周前sql quit工作的顶部。为了解决它,我以第二种方式重新编码并获得正确的结果。令我感到困惑的是,为什么第一部分似乎在过去的几年里工作了,现在却没有?
SELECT @AloneRecordCount = count(*)
FROM inserted i
INNER JOIN deleted d on i.id = d.id
WHERE i.StatusID = 32
AND d.StatusID <> 32
AND i.id IN
(SELECT settlementid FROM vwFundingDisbursement fd
WHERE fd.DisbTypeName LIKE '%Alone'
AND fd.PaymentMethodID = 0)
SELECT @AloneRecordCount = count(i.id)
FROM inserted i INNER JOIN
deleted d on i.id = d.id
JOIN vwFundingDisbursement fd on i.id = fd.settlementid
WHERE i.StatusID = 32
AND d.StatusID <> 32
AND fd.DisbTypeName like '%Alone'
AND fd.PaymentMethodID = 0
这是在SQL Server 2005上 没有错误,而top语句只返回1或0 而底部语句将返回找到的实际数字。
答案 0 :(得分:4)
您是否获得了null vwFundingDisbursement.settlementid值?那最近出现了吗?
答案 1 :(得分:1)
架构(或至少如何创建视图)会有所帮助,但这是猜测......
如果要在vwFundingDisbursement中查找分配类型名称中值为“Alone”的多行,则当源表(INSERTED)连接到视图中的多行时,JOIN将返回多行。如果你使用IN,SQL不关心它是否返回多个匹配,它只会给你一行。
举个例子:
CREATE TABLE dbo.Test_In_vs_Join1
(
my_id INT NOT NULL
)
CREATE TABLE dbo.Test_In_vs_Join2
(
my_id INT NOT NULL
)
INSERT INTO dbo.Test_In_vs_Join1 (my_id) VALUES (1)
INSERT INTO dbo.Test_In_vs_Join1 (my_id) VALUES (2)
INSERT INTO dbo.Test_In_vs_Join1 (my_id) VALUES (3)
INSERT INTO dbo.Test_In_vs_Join1 (my_id) VALUES (4)
INSERT INTO dbo.Test_In_vs_Join1 (my_id) VALUES (5)
INSERT INTO dbo.Test_In_vs_Join2 (my_id) VALUES (1)
INSERT INTO dbo.Test_In_vs_Join2 (my_id) VALUES (1)
INSERT INTO dbo.Test_In_vs_Join2 (my_id) VALUES (2)
INSERT INTO dbo.Test_In_vs_Join2 (my_id) VALUES (3)
INSERT INTO dbo.Test_In_vs_Join2 (my_id) VALUES (3)
SELECT
T1.my_id,
COUNT(*)
FROM
dbo.Test_In_vs_Join1 T1
INNER JOIN dbo.Test_In_vs_Join2 T2 ON
T2.my_id = T1.my_id
GROUP BY
T1.my_id
SELECT
T1.my_id,
COUNT(*)
FROM
dbo.Test_In_vs_Join1 T1
WHERE
T1.my_id IN (SELECT T2.my_id FROM dbo.Test_In_vs_Join2 T2)
GROUP BY
T1.my_id
在旁注中,将列嵌入另一列内部是违反规范化形式的,并且只是提出问题。在触发器中执行这种业务逻辑也是一条危险的道路,当你发现它时会失败。
答案 2 :(得分:0)
答案 3 :(得分:0)
我假设这个MSSQL(?)并且它正在处理UPDATE语句,因为你要加入插入/删除的表?
这个触发器在哪个表上?