【问题标题】:"EXECUTE" function within trigger not functioning in TSQL on SERVER触发器中的“EXECUTE”函数在 SERVER 上的 TSQL 中不起作用
【发布时间】:2014-05-22 21:41:45
【问题描述】:

这是我试图在触发器中运行的代码。在触发器中,由于 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

【问题讨论】:

  • 你试过使用 exec sp_executesql @sql 吗?
  • 很难说,我找不到任何特别禁止在触发器中调用 exec 的东西。可能是服务器名称包含需要转义的字符,或者服务器名称还指定了模式。将其包装在 TRY/CATCH 中,并使用一些示例 here 记录到您的错误表中以找出答案。
  • 您正在为目标表使用由四部分组成的标识符。 EXEC http://msdn.microsoft.com/en-us/library/ms188332(v=sql.105).aspx 的 MSDN 文档有一些关于“上下文切换”的注释,这可能是它失败的原因。另外,一个明显的问题 - 触发触发器的用户是否有权更新远程服务器上的表?除非使用 Windows 身份验证和相同的网络,否则很可能不会。我不确定您是否可以在触发器中使用 OPENROWSETOPENQUERY,但这可能是一种替代解决方案。
  • 我试图通过将服务器直接硬编码到代码中来规避这一点,因此我不必执行它。它仍然失败,但如果我删除触发器,它会出现在桌子上。触发器失败并且没有将更新传递到另一台计算机:(

标签: sql sql-server tsql triggers


【解决方案1】:

我放弃了这一点,并开始使用本地服务器上的文本文件并在后台运行进程来排队 sql 语句。

【讨论】:

    猜你喜欢
    • 2016-09-11
    • 2010-11-17
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多