sql-server - 如何从 SQL Server 触发器中获取结果集
问题描述
我在 SQL Server 触发器中进行了一些验证和检查,但我无法从触发器中获取自定义选择语句。我需要将它放入临时表或一些变量中,该怎么做?
表结构:
create table Orders
(
ID int identity(1,1),
OrderNo nvarchar(50),
Product nvarchar(100),
Quantity int
)
我的触发器:
create trigger [dbo].[OrderInsertTrigger]
on [dbo].[Orders]
instead of insert
as
begin
set nocount on;
-- Some Checks here for validation.. some codes..
select 1 as result, 'insert is successful' as message return
end
插入查询进行测试;
insert into Orders (OrderNo, Product, Quantity)
select 123, 'ice cream', 100
我尝试了子括号(只是猜测捕获触发输出)但没有奏效;
Declare @temp table(bit result, msg nvarchar(200))
insert into @temp
from
(insert into Orders(OrderNo,Product,Quantity) select 123, ''ice cream'', 100')
as t
我尝试了一些动态 SQL,但没有奏效;
Declare @temp table(bit result, msg nvarchar(200))
insert into @temp Exec('insert into Orders(OrderNo,Product,Quantity) select 123, ''ice cream'', 100')
从触发器中捕获该自定义选择语句的方法是什么?或者有可能吗?
编辑
我的目标实际上是,我想在 CRUD 操作之前进行一些验证,以防止 SQL 错误,如字段可空检查、外键检查、值范围检查或根据客户需要进行的一些自定义检查。我想从 SQL Server 向客户端反映我的自定义响应(可能来自触发器或???)
所以我的问题是,如何以有效的方式以静态或动态方式对太多 SQL Server 表进行审计和验证?
解决方案
如果您修复表变量声明中的语法错误,则问题中的动态 SQL 查询将起作用:
DECLARE @temp TABLE(result bit, msg nvarchar(200));
INSERT INTO @temp
EXEC('insert into Orders(OrderNo,Product,Quantity) select 123, ''ice cream'', 100');
SELECT * FROM @temp;
请注意,不应从触发器返回结果集,并且在未来的 SQL Server 版本中将删除这样做的能力。可能有更好的方法来完成这个xy 问题的最终结果。
推荐阅读
- javascript - 在 OpenLayers 地图中显示多边形
- swift - SwiftUI 中的 .primary 和 .secondary 颜色是什么?
- docker - 如何在内部实验室中使用 Rancher 负载均衡器
- angular - Angular 4 重写资产 url
- c# - 对象实例化是否必须在使用块表达式内部发生?
- python - Python ElementTree 解析并写入为原始格式
- java - UrlEncodedFormEntity 在 Apache HttpClient 4 中做了什么?
- python - Plotly:如何使用滑块调整直方图 bin 大小?
- html - 我怎样才能让这些单选按钮内联并排放置
- .net-core - 如何仅通过 Localhost 中的代码创建 Azure 函数并使用 Azure Active Directory 对其进行配置?