Sql server SQL Server表值函数?布拉格自治事务
我们有一些第三方软件,使用ODBC从Oracle数据库中选择数据 在Oracle中,我们将数据作为流水线函数(而不是表或视图)公开,因为我们希望审核Sql server SQL Server表值函数?布拉格自治事务,sql-server,oracle,transactions,pragma,Sql Server,Oracle,Transactions,Pragma,我们有一些第三方软件,使用ODBC从Oracle数据库中选择数据 在Oracle中,我们将数据作为流水线函数(而不是表或视图)公开,因为我们希望审核选择。Oracle pipelined函数使用PRAGMA autonomy_TRANSACTION开关,以便我们可以为每一行将一行写入审核表,并将其返回到ODBC Select 这真是太棒了!但我们现在需要从SQL Server而不是Oracle执行同样的操作 我原以为我们可以用SQL Server表值函数代替Oracle的流水线函数来实现这一点,
选择
。Oracle pipelined函数使用PRAGMA autonomy_TRANSACTION
开关,以便我们可以为每一行将一行写入审核表,并将其返回到ODBC Select
这真是太棒了!但我们现在需要从SQL Server而不是Oracle执行同样的操作
我原以为我们可以用SQL Server表值函数代替Oracle的流水线函数来实现这一点,但我们遇到了“你不应该在函数中执行DML”定律
我们已经用一个过程尝试过了,但是第三方软件不会有它——当我告诉它“EXEC”时,它就失败了
SQL Server中是否有一个
PRAGMA自治\u事务
等价物?或者对于我想做的事情还有其他选择吗?在函数中调用master..xp\u cmdshell有一个解决方案
您能否在问题中添加MS SQL server版本?
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