从操作更新、删除、插入到存储过程 SQL 中设置值
Posted
技术标签:
【中文标题】从操作更新、删除、插入到存储过程 SQL 中设置值【英文标题】:Set Value From Action Update, Delete, Inserted in Stored Procedure SQL 【发布时间】:2020-01-13 07:08:02 【问题描述】:我已经创建了我的存储过程,但是我很困惑如何从我的表中设置一列。
这与我的代码是分开的:
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_OPERASIONAL
列设置为 1(如果有来自另一个字段的新数据),2 表示存在来自另一个字段的更新数据,3 表示来自存储过程中另一个字段的已删除数据。
此代码的错误是:
无效的对象名称“插入”
【问题讨论】:
表INSERTED
和DELETED
来自哪里?它们通常用于触发器,但不会自动存在于 SP 中。
@DaleK 我应该创建插入表和删除表吗?
@aldonnihut 存储过程既没有插入计数也没有删除计数,您实际上是在尝试创建触发器吗?我建议添加一些示例数据和您的预期结果,以尝试阐明您要完成的工作。
@DaleK 是的,我想在我的存储过程中创建触发器。
旁注:您应该不为您的存储过程使用sp_
前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_
并使用其他东西作为前缀 - 或者根本没有前缀!
【参考方案1】:
错误显示的问题是您不能在存储过程中使用已删除/插入的表,而只能在触发器中访问。
如果您想计算表中插入记录或删除记录的数量,有两种方法可以做到这一点,最简单的一种是:
像这样创建你的存储过程:
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
类似的问题是更多其他方式,如临时表或...How use inserted\deleted table in stored procedure?
下面的链接也是一个问题,要求为删除和插入定义触发器,以便您可以同时使用已删除/插入的表SQL Trigger on Update, Insert, Delete on non-specific row, column, or table
当您经常执行所有这些过程时,第二种更好的方法是获取插入、更新或删除的日志,这样您就不会使用会降低过程性能的触发器。 (如果有用我可以推荐一些保存表日志的想法)
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
【讨论】:
感谢您的回答,但我不知道如何创建触发器。请帮助我 @aldonnihut 使用此链接mysqltutorial.org/create-the-first-trigger-in-mysql.aspx 我应该在存储过程中创建触发器还是在存储过程中创建触发器 @aldonnihut 在这里。可以帮助你 @MartinSmith 问题标签是 mysql 然后已被编辑到 sqlserver!我什至搜索将我的语法从 sqlserver 更改为 mysql :)以上是关于从操作更新、删除、插入到存储过程 SQL 中设置值的主要内容,如果未能解决你的问题,请参考以下文章
Entity Framework 6 Recipes 2nd Edition(10-10)译 - > 为TPH继承的插入更新删除操作映射到存储过程