Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;执行;触发器中的函数在服务器上的TSQL中不起作用_Sql_Sql Server_Tsql_Triggers - Fatal编程技术网

&引用;执行;触发器中的函数在服务器上的TSQL中不起作用

&引用;执行;触发器中的函数在服务器上的TSQL中不起作用,sql,sql-server,tsql,triggers,Sql,Sql Server,Tsql,Triggers,这是我试图在触发器中运行的代码。在触发器中,由于EXEC行而失败。我知道这一点,因为当我取出它时,代码至少完成了执行。如果我把它放在里面,它甚至都懒得完成。我知道这一点,因为如果我取出exec行,它会将sql行写入错误表 我必须在这里使用EXEC命令来写入远程服务器。我不能使用nvarchar变量来定义服务器。Insert需要一个显式表或表变量。我需要能够写到这个远程服务器,我不知道它的名称,直到运行时,所以我不能明确。我如何在触发器中使用EXEC,或者是否有其他方法来剥这只猫的皮 DECLAR

这是我试图在触发器中运行的代码。在触发器中,由于EXEC行而失败。我知道这一点,因为当我取出它时,代码至少完成了执行。如果我把它放在里面,它甚至都懒得完成。我知道这一点,因为如果我取出exec行,它会将sql行写入错误表

我必须在这里使用EXEC命令来写入远程服务器。我不能使用nvarchar变量来定义服务器。Insert需要一个显式表或表变量。我需要能够写到这个远程服务器,我不知道它的名称,直到运行时,所以我不能明确。我如何在触发器中使用EXEC,或者是否有其他方法来剥这只猫的皮

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
,但这可能是另一种解决方案。我试图通过将服务器直接硬编码到代码中来避免这种情况,这样我就不必执行它了。它仍然会失败,不过如果我移除触发器,它将返回到表中。触发器失败,无法将更新传递到其他计算机:(