Sql server 如何从SQL Server触发器获取结果集

Sql server 如何从SQL Server触发器获取结果集,sql-server,tsql,triggers,resultset,dml,Sql Server,Tsql,Triggers,Resultset,Dml,我在SQLServer触发器中进行了一些验证和检查,但无法从触发器中获取自定义select语句。我需要把它放到一个临时表或一些变量中,怎么做 表结构: create table Orders ( ID int identity(1,1), OrderNo nvarchar(50), Product nvarchar(100), Quantity int ) 我的触发器: create trigger [dbo].[OrderInsertTrigger] o

我在SQLServer触发器中进行了一些验证和检查,但无法从触发器中获取自定义select语句。我需要把它放到一个临时表或一些变量中,怎么做

表结构:

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
 Declare @temp table(bit result, msg nvarchar(200))
 insert into @temp  Exec('insert into Orders(OrderNo,Product,Quantity) select 123, ''ice cream'', 100')
我尝试了一些动态SQL,但没有成功

 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
 Declare @temp table(bit result, msg nvarchar(200))
 insert into @temp  Exec('insert into Orders(OrderNo,Product,Quantity) select 123, ''ice cream'', 100')
从触发器捕获自定义select语句的方法是什么?还是有可能

编辑

实际上,我的目标是,我想在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查询将正常工作:

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;

请注意,不应从触发器返回结果集以及返回结果集的能力。可能有更好的方法来实现最终结果。

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