&引用;执行;触发器中的函数在服务器上的TSQL中不起作用
这是我试图在触发器中运行的代码。在触发器中,由于EXEC行而失败。我知道这一点,因为当我取出它时,代码至少完成了执行。如果我把它放在里面,它甚至都懒得完成。我知道这一点,因为如果我取出exec行,它会将sql行写入错误表 我必须在这里使用EXEC命令来写入远程服务器。我不能使用nvarchar变量来定义服务器。Insert需要一个显式表或表变量。我需要能够写到这个远程服务器,我不知道它的名称,直到运行时,所以我不能明确。我如何在触发器中使用EXEC,或者是否有其他方法来剥这只猫的皮&引用;执行;触发器中的函数在服务器上的TSQL中不起作用,sql,sql-server,tsql,triggers,Sql,Sql Server,Tsql,Triggers,这是我试图在触发器中运行的代码。在触发器中,由于EXEC行而失败。我知道这一点,因为当我取出它时,代码至少完成了执行。如果我把它放在里面,它甚至都懒得完成。我知道这一点,因为如果我取出exec行,它会将sql行写入错误表 我必须在这里使用EXEC命令来写入远程服务器。我不能使用nvarchar变量来定义服务器。Insert需要一个显式表或表变量。我需要能够写到这个远程服务器,我不知道它的名称,直到运行时,所以我不能明确。我如何在触发器中使用EXEC,或者是否有其他方法来剥这只猫的皮 DECLAR
DECLARE @acctNum int
DECLARE @tickets nvarchar(MAX)
DECLARE @server nvarchar(64)
DECLARE @sql nvarchar(MAX)
if EXISTS (SELECT * FROM dbo.queueNames WHERE queueName = 'queue1')
BEGIN
SELECT @server = queueServer FROM dbo.queueNames WHERE queueName = 'queue1'
SET @server = @server + '.[AMEETING].dbo.tblMembers'
SELECT TOP 1 @acctNum = AccountNum, @tickets = Tickets FROM dbo.queue1 ORDER BY AccountNum
SET @sql = 'UPDATE ' + @server + ' SET Present = ''1'', Tickets = ''' + @tickets + ''' WHERE AccountNum = ' + convert(nvarchar(64),@acctNum)
INSERT INTO dbo.errors values (@sql)
EXEC (@sql)
DELETE FROM dbo.queue1 WHERE AccountNum = @acctNum
END
我放弃了这一点,转而在本地服务器上使用文本文件,并在后台运行进程来对sql语句进行排队。您是否尝试过使用exec sp_executesql@sql?很难说,我找不到任何明确禁止触发器中的exec调用的方法。服务器名称可能包含需要转义的字符,或者服务器名称也在指定架构。将其包装在TRY/CATCH中,并使用一些示例登录到错误表以找出问题。您正在为目标表使用一个由四部分组成的标识符。
EXEC
的MSDN文档中有一些关于“上下文切换”的注释,这可能是它失败的原因。还有一个明显的问题——触发触发器的用户是否有权更新远程服务器上的表?很可能不会,除非使用Windows auth和同一网络。我不确定是否可以从触发器中使用OPENROWSET
或OPENQUERY
,但这可能是另一种解决方案。我试图通过将服务器直接硬编码到代码中来避免这种情况,这样我就不必执行它了。它仍然会失败,不过如果我移除触发器,它将返回到表中。触发器失败,无法将更新传递到其他计算机:(