从存储过程SQL中插入的操作更新、删除中设置值
我已经创建了存储过程,但我不知道如何从表中设置一列 这与我的代码是分开的:从存储过程SQL中插入的操作更新、删除中设置值,sql,sql-server,stored-procedures,sql-update,sql-insert,Sql,Sql Server,Stored Procedures,Sql Update,Sql Insert,我已经创建了存储过程,但我不知道如何从表中设置一列 这与我的代码是分开的: CREATE PROC [dbo].[SP_Gabungan] @REPORT_DT DATE AS BEGIN DECLARE @action NVARCHAR(10), @insCount INT = (SELECT COUNT (*) FROM INSERTED), @delCount INT = (SELECT COUNT (*) FROM DELE
CREATE PROC [dbo].[SP_Gabungan]
@REPORT_DT DATE
AS
BEGIN
DECLARE @action NVARCHAR(10),
@insCount INT = (SELECT COUNT (*) FROM INSERTED),
@delCount INT = (SELECT COUNT (*) FROM DELETED)
SELECT
@REPORT_DT AS REPORT_DATE,
FD.BRANCH_CODE AS [BRANCH],
@action AS [ID_OPERATIONAL], -- I want to set this value as 1(if there is a new input data, 2
-- (if there is updated data), 3 (if there is deleted data) from
-- from another field
BR.REGULATOR_BRANCH as [RG_BRANCH]
FROM
[DBO].[F_RR_FUNN] FD
LEFT JOIN
[DBO].[MS_BRANCH] BR ON BR.BRANCH_CD = FD.BRANCH_CODE
WHERE
FD.GROUP_PRODUCT = 'CA'
AND Y17sa = '1'
AND FD.REPORT_DATE = @REPORT_DT
END
如何将列ID\u operational
设置为1(如果存在来自另一个字段的新数据),2表示来自另一个字段的已存在更新数据,3表示存储过程中来自另一个字段的已删除数据
此代码的错误是:
无效的对象名称“已插入”
错误显示的问题是,不能在存储过程中使用已删除/插入的表,而只能在触发器中访问 如果要在表中统计插入记录或删除记录的数量,有两种方法,最简单的方法是:
创建如下所示的存储过程:
CREATE PROC [dbo].[SP_Gabungan]
@REPORT_DT DATE,@DeletedCount INT , @InsertedCount Int
AS
BEGIN
...
在插入和删除后创建触发器(这样您就可以插入/删除表)然后像在代码中一样获取计数:
DECLARE @action nvarchar (10),
@insCount int = (SELECT COUNT (*) FROM INSERTED),
@delCount int = (SELECT COUNT (*) FROM DELETED)
在触发器中调用存储过程,并将@insCount和@delCount作为输入传递
EXEC [dbo].[SP_Gabungan]
@REPORT_DT = GETDATE() , @InsertedCount = @insCount , @DeletedCount = @delCount
类似的问题也适用于更多其他方式,如临时表或…此外,下面的链接是一个问题,询问如何为delete和insert定义触发器,以便您可以同时使用已删除/插入的表
第二种更好的方法是,当您大量执行这些过程时,获取插入、更新或删除的日志,这样您就不会使用降低过程性能的触发器。
(如果有用,我可以推荐一些保存表日志的方法)
插入的
表和删除的表从何而来?它们通常用于触发器,但不会自动存在于SPs中。@DaleK我应该创建tabel inserted和delete table吗?@aldonnihut存储过程既没有insert计数,也没有delete计数,您实际上是在尝试创建触发器吗?我建议添加一些示例数据,以及您的预期结果,以尝试澄清您试图实现的目标。@DaleK是的,我想在我的存储过程中创建触发器。旁注:您不应该在存储过程中使用sp
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用sp.
并使用其他东西作为前缀,或者根本不使用前缀!谢谢你的回答,但我不知道如何创建触发器。请帮忙me@aldonnihut我应该在存储过程中还是在存储外创建触发器,请使用此链接procedure@aldonnihut给你。可能有帮助you@MartinSmith问题标签是mysql,然后已编辑到sqlserver!我甚至搜索将我的语法从sqlserver更改为mysql:)
CREATE PROC [dbo].[SP_Gabungan]
@REPORT_DT DATE
,@DeletedCount INT
,@InsertedCount INT
,@UpdateCount INT
AS BEGIN
DECLARE @action INT
SET @action = CASE
WHEN @InsertCount <> 0 THEN 1
WHEN @UpdateCount <> 0 THEN 2
WHEN @DeletedCount <> 0 THEN 3
END
SELECT
@REPORT_DT AS REPORT_DATE,
FD.BRANCH_CODE AS [BRANCH],
@action AS [ID_OPERATIONAL],
BR.REGULATOR_BRANCH as [RG_BRANCH]
FROM
[DBO].[F_RR_FUNN] FD
LEFT JOIN
[DBO].[MS_BRANCH] BR ON BR.BRANCH_CD = FD.BRANCH_CODE
WHERE
FD.GROUP_PRODUCT = 'CA'
AND Y17sa = '1'
AND FD.REPORT_DATE = @REPORT_DT END
CREATE TRIGGER [YourTriggerName]
AFTER INSERT/UPDATE/DELETE ON [db].[tablename]
FOR EACH ROW
BEGIN
DECLARE
@insCount int = (SELECT COUNT (*) FROM New), -- New in MySQL is same as inserted,deleted,updated
@delCount int = (SELECT COUNT (*) FROM Old),
@upCount int = (SELECT COUNT (*) FROM New),
EXEC [dbo].[SP_Gabungan]
@REPORT_DT = GETDATE()
,@DeletedCount = @delCount
,@InsertedCount = @insCount
,@UpdateCount = @upCount
END