在存储过程事务错误中执行addlinkedServer

时间:2014-05-19 09:00:24

标签: sql sql-server stored-procedures

我正在尝试在T-SQL中的存储过程中执行链接服务器。

但是,我收到了错误

  

程序' sys.sp_addlinkedserver'无法在交易中执行。

这似乎很明显。但我之后需要使用动态SQL执行2个查询,但是我在执行查询之前尝试添加链接服务器,所以不确定错误出现的原因。

这是代码。

  @sqlDBName VARCHAR(MAX),
  @sqlServerName VARCHAR(MAX)
  AS

  EXEC sp_addlinkedserver 
  @sqlServerName,
  N'SQL Server';


  DECLARE @impUpd VARCHAR(MAX)

  SET @impUpd = '

  UPDATE Customers SET NAME = 'Name'
  FROM Customers c
  JOIN ['+@sqlServerName +'].['+@sqlDBName +'].[dbo].[CUSTOMERS2] 
  ..etc


  exec(@impUpd)

任何帮助都会很好。

谢谢

2 个答案:

答案 0 :(得分:3)

好吧,尽管Tanner的代码是正确且有效的,但它并没有真正回答我问的问题..(是的好吧......我很糟糕(投票不好或者你想做什么)。但是,我找到了解决问题的方法。重复一遍,它是"程序' sys.sp_addlinkedserver'无法在交易中执行"

它与SQL没有任何关系,它与从C#和实体Freamework执行存储过程有关。

当我用

调用SP时发生了错误
m_Context.Database.ExecuteSqlCommand("usp_storedprocedureName");

它与

一起使用
m_Context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction,"usp_storedprocedureName");

在不研究额外参数的作用的情况下,我无法提供其工作原因(不会明确枚举所说的内容!),但是这里有更多信息。

Stored procedure working when calling exec sp and throws with EF6 on SQL Azure

我希望这会有所帮助。

答案 1 :(得分:2)

如果您需要动态创建链接服务器,而不是手动创建链接服务器,那么请在它自己的存储过程中执行此操作,只执行此操作,以便您拥有“ Separation of Concerns < / EM>”。

您不希望开始将链接服务器创建添加到执行其他操作的存储过程中,否则会在许多地方发生。

因此,在您的应用程序中,无论是在启动时还是代码执行中某些合理的位置,都要调用存储过程来检查链接服务器是否存在,如果不存在则创建它。然后从那时起你可以确定它存在。

有关创建链接服务器的代码示例,请参阅this post

<强>示例

DECLARE @sqlServerName VARCHAR(MAX)

IF NOT EXISTS (SELECT 1 from sys.servers where name = @sqlServerName)
BEGIN
  PRINT 'Does not exist, need to create link'
  EXEC sp_addlinkedserver @server = @sqlServerName, @srvproduct=N'SQL Server'
END