SQL Server表值函数? PRAGMA AUTONOMOUS_TRANSACTION

时间:2015-10-28 15:24:25

标签: sql-server oracle transactions pragma

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

在Oracle中,我们将数据公开为流水线函数(而不是表或视图),因为我们要审计SELECT。 Oracle流水线函数使用PRAGMA AUTONOMOUS_TRANSACTION开关,以便我们可以为管道返回ODBC选择的每一行写一行到审计表。

这非常出色!但我们现在需要从SQL Server而不是Oracle中做同样的事情。

我原以为我们可以使用SQL Server表值函数代替Oracle的流水线函数来实现这一点,但我们已经命中了你不能在函数中执行DML&#39 ;法。

我们已经尝试了一个程序,但是第三方软件没有它 - 当我告诉它'EXEC'

时,它就会失败

SQL Server中是否有PRAGMA AUTONOMOUS_TRANSACTION个等效项?或者我还想做什么其他选择?

1 个答案:

答案 0 :(得分:1)

通过在你的函数中调用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