如何在不需要分布式事务的情况下存储存储过程的结果?

Ian*_*oyd 5 sql-server sql-server-2008-r2

我有一个正在运行的远程存储过程:

EXECUTE Contoso.Frob.dbo.Grobber @StartDate='20140513', @EndDate='20140518'
Run Code Online (Sandbox Code Playgroud)

并且此远程存储过程返回行集:

EmployeeID  EmployeeName    StartDateTime            EndDateTime
----------  --------------  -------------            -----------------------
619         Guyer, Kirsten  2014-05-13 19:00:00.000  2014-05-13 19:00:00.000
...
Run Code Online (Sandbox Code Playgroud)

优秀.完善.好.甜.

现在我有这些结果,我需要将它们存储在一个表中.任何一种表.我不在乎什么样的表:

  • 物理表
  • 临时表
  • 全球临时表
  • 表变量

我只需要存储它们以便我可以处理它们.问题是,当我尝试将结果插入表中时,是否为:

SQL Server 坚持(不,要求)它开始分布式事务:

用于链接服务器"Contoso"的OLE DB提供程序"SQLNCLI10"返回消息"伙伴事务管理器已禁用其对远程/网络事务的支持.".
消息7391,级别16,状态2,行41
无法执行操作,因为链接服务器"Contoso"的OLE DB提供程序"SQLNCLI10"无法启动分布式事务.

为什么不......

现在,无法对Contoso服务器进行更改.为什么?无所谓.假装杰克鲍尔将出庭并关注任何试图修改Contoso的人.这意味着我无法启用或重新配置MSDTC \\Contoso.

你尝试过使用过READ UNCOMMITTED吗?

是.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
INSERT INTO @EmployeeSchedule 
EXECUTE wclnightdb.NGDemo.dbo.tbtGetSchedule @StartDate, @EndDate 
Run Code Online (Sandbox Code Playgroud)

合作伙伴事务管理器已禁用其对远程/网络事务的支持.

和:

INSERT INTO #EmployeeSchedule 
WITH (NOLOCK)
EXECUTE wclnightdb.NGDemo.dbo.tbtGetSchedule @StartDate, @EndDate 
Run Code Online (Sandbox Code Playgroud)

抱歉.没有nolock.诺洛克是不是不

消息1065,级别15,状态1,行15
对于INSERT,UPDATE,DELETE或MERGE语句的目标表,不允许使用NOLOCK和READUNCOMMITTED锁提示.

我总是可以放弃SQL Server

如果我在编程环境中这样做,那么修复起来相当容易:

using (IDataReader rdr = ADOHelper.Execute(conn, "EXECUTE Contoso.Frob.dbo.Grobber @StartDate='20140513', @EndDate='20140518'")
{
   while (rdr.Read())
   {
       InsertRowIntoTable(conn, rdr);
   }
}
Run Code Online (Sandbox Code Playgroud)

虽然这需要我创建一个二进制文件,运送它,并安排它.我正在寻找适用于SQL Server的选项(因此SQL代理可以安排作业).

奖金阅读

Syl*_*via 0

这个怎么样:

-- 创建一个通过 SQLSMD 命令运行远程 sql 的作业,或者只运行如下所示的命令: EXEC master..xp_cmdshell 'SQLCMD -S Server\SQLSERVERDEV2005 -i"c:\DML.sql"' (可能是作业更容易,因为您可以通过 sp_update_jobstep 轻松修改作业步骤以获得参数的正确值)

-- 将sqlcmd的结果输出到文件中

-- 通过批量导入将文件加载到表中。