【发布时间】: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 记录到您的错误表中以找出答案。
-
您正在为目标表使用由四部分组成的标识符。
EXEChttp://msdn.microsoft.com/en-us/library/ms188332(v=sql.105).aspx 的 MSDN 文档有一些关于“上下文切换”的注释,这可能是它失败的原因。另外,一个明显的问题 - 触发触发器的用户是否有权更新远程服务器上的表?除非使用 Windows 身份验证和相同的网络,否则很可能不会。我不确定您是否可以在触发器中使用OPENROWSET或OPENQUERY,但这可能是一种替代解决方案。 -
我试图通过将服务器直接硬编码到代码中来规避这一点,因此我不必执行它。它仍然失败,但如果我删除触发器,它会出现在桌子上。触发器失败并且没有将更新传递到另一台计算机:(
标签: sql sql-server tsql triggers