【问题标题】:How to get resultset from a SQL Server trigger如何从 SQL Server 触发器中获取结果集
【发布时间】:2020-07-24 03:57:07
【问题描述】:

我在 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 表进行审计、验证?

【问题讨论】:

  • 不要在触发器中返回数据集已被弃用,将从 SQWL 服务器中删除。这感觉像是一个 XY 问题。
  • 我认为您不想使用约束购买 NULL 约束,而另一种类型的约束将是您更真实的选择。另一方面,如果您没有解决问题,您可以使用触发器并控制它们,如果此验证不正确,您可以回滚并返回错误。因此,您的问题可以有非常广泛的答案。
  • 我的意见是你不应该阻止 SQL 错误,而是在应用程序代码中适当地处理它们。这将允许您利用声明性约束并仅在触发器无法完成工作时才使用触发器。在触发规则的情况下,使用所需的上下文信息引发错误,并在应用端进行处理。
  • 我可以捕获一个自定义引发的错误,在应用程序端的 try cath 块中,我注意到了这个想法,但我只记得有 sql 表类型。现在我有了一个新想法,我将对其进行测试,它可以替代跳跳逻辑。我的想法是使用 sql 表类型将 CRUD 请求(在临时表中)发送到 sql 过程,然后进行审核,如果通过,则在同一过程中执行 CRUD 操作,并将该过程的结果作为输出返回。我去试试

标签: sql-server tsql triggers resultset dml


【解决方案1】:

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

请注意,不应从触发器返回结果集以及这样做的能力will be removed in a future SQL Server version。可能有更好的方法来完成这个x-y problem 的最终结果。

【讨论】:

  • 它给出了错误:不能嵌套 INSERT EXEC 语句。我同意你的 X,我觉得这似乎是一个 XY 问题,我要编辑我的问题
猜你喜欢
  • 2013-10-06
  • 1970-01-01
  • 2018-08-01
  • 2018-06-20
  • 2018-10-30
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多