我正在尝试在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)
任何帮助都会很好。
谢谢
答案 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