我可以将参数传递给外部(CLR)SQL Server触发器吗?

时间:2009-07-14 22:22:46

标签: sql-server sql-server-2005 triggers sqlclr

我在SQL Server中有一个触发器,但我需要将参数传递给CLR代码,即触发器上下文中未提供的信息。

这样的事情是否可能?

CREATE TRIGGER MyTrigger ON MyTable FOR INSERT
AS EXTERNAL NAME MyAssembly.MyNamespace.MyTriggerHandler("Foo", "Bar")

当然,这些论点是静态的。

参数排列的数量是离散的,但是在每个CLR程序集中为每个创建一个单独的类或函数会很笨重,并且需要一个编译/部署步骤,我希望每次需要另一个触发器时避免它。

3 个答案:

答案 0 :(得分:1)

经过一番研究,看来我想做什么,做不到。

使用触发器“external name”子句传递的方法必须是无参数的,并且不能在CREATE TRIGGER语句中修改SqlTriggerContext。

我最终选择了排列路径并且支持的参数变化较少。也许下一次.NET集成会更加强大。

答案 1 :(得分:1)

从某种意义上说,您可以将信息传递给触发器(无论是T-SQL还是SQLCLR),而不是直接在问题中显示。尽管如此,您还有2或3个选项可以将不属于DML操作本身的信息传递给事件链中的任何触发器:

  1. 本地临时表
  2. SET CONTEXT_INFO / CONTEXT_INFO
  3. 在SQL Server 2016或更高版本上:sp_set_session_context / SESSION_CONTEXT
  4. 在所有情况下,您都可以通过执行SqlCommand(使用"Context Connection = true;"作为连接字符串)和输出SqlParameter来获取值,以将值拉入.NET代码中。

答案 2 :(得分:0)