SQL服务器table值函数?语法 AUTONOMOUS_TRANSACTION

SQL Server table-valued function? PRAGMA AUTONOMOUS_TRANSACTION

我们有一些第三方软件可以使用 ODBC 从 Oracle 数据库中选择数据。

在 Oracle 中,我们将数据公开为管道函数(而不是 table 或视图),因为我们要审计 SELECT。 Oracle 管道函数使用 PRAGMA AUTONOMOUS_TRANSACTION 开关,以便我们可以为我们通过管道返回 ODBC Select.

的每一行写入审计 table

这太棒了!但是我们现在需要从 SQL 服务器而不是 Oracle 做同样的事情。

我原以为我们可以使用 SQL 服务器 table 值函数来代替 Oracle 的流水线函数来做到这一点,但我们已经触及了 'thou shalt not execute DML in a function' 法则。

我们已经用程序试过了,但是第三方软件没有-我告诉它时它就崩溃了'EXEC'

SQL 服务器中是否有 PRAGMA AUTONOMOUS_TRANSACTION 等价物?或者我想做的事情还有其他选择吗?

通过在你的函数中调用 master..xp_cmdshell 有一个解决方案 the question on dba.stackexchange.com

CREATE FUNCTION loophole(@i int) RETURNS varchar(20) AS
  BEGIN
     DECLARE @sql varchar(MAX),
             @cmd varchar(4000)
     SELECT @sql = ' UPDATE rsci ' +
                   ' SET b = CASE ' + ltrim(str(@i + 1)) +
                   ' WHEN 1 THEN ''Ett'' WHEN 2 THEN ''Två''' +
                   ' WHEN 3 THEN ''Tre'' WHEN 4 THEN ''Fyra''' +
                   ' WHEN 5 THEN ''Fem'' WHEN 6 THEN ''Sex''' +
                   ' WHEN 7 THEN ''Sju'' WHEN 8 THEN ''Åtta''' +
                   ' WHEN 9 THEN ''Nio'' WHEN 10 THEN ''Tio'' END' +
                   ' WHERE a = ' + ltrim(str(@i + 1))
     SELECT @cmd = 'sqlcmd -S ' + @@servername + ' -d ' + db_name() +
                   ' -Q "' + @sql + '"'
     EXEC master..xp_cmdshell @cmd, 'no_output'
     RETURN (SELECT b FROM rsci WHERE a = @i)
  END