首页 > 解决方案 > 如何从 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-servertsqltriggersresultsetdml

解决方案


如果您修复表变量声明中的语法错误,则问题中的动态 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 问题的最终结果。


推荐阅读