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

cgvd09ve  于 2022-10-31  发布在  其他
关注(0)|答案(2)|浏览(217)

我尝试在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)

任何帮助都是好的。
谢谢

6ovsh4lw

6ovsh4lw1#

我找到了解决我问题的方法。它与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

nr9pn0ug

nr9pn0ug2#

如果需要动态创建链接服务器,而不是预先手动创建,则在它自己的存储过程中创建,这样您就有了“Separation of Concerns"。
您不希望开始将该链接服务器创建添加到执行其他操作的存储过程中,否则它将在许多地方发生。
因此,在应用程序中,无论是在启动时还是在代码执行的某个适当时刻,都要调用一个存储过程来检查链接服务器是否存在,如果不存在,就创建一个链接服务器。然后,从那时起,您就可以确定它是否存在。
有关创建链接服务器(如果不存在)的代码示例,请参见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

相关问题