【问题标题】:tsql : can't select into <table> from procsql : 无法从 proc 中选择 <table>
【发布时间】:2011-02-01 07:38:35
【问题描述】:

我正在运行 sql server 2008,我正在尝试运行查询

OPEN CUR_InvHeader
FETCH NEXT FROM CUR_InvHeader INTO 
    @CH_iBilling_Log_RecID
WHILE (@@FETCH_STATUS = 0) BEGIN        --Loop for Cur_InvHeader

select * into tarInvoiceDetail_201101 FROM OPENROWSET('SQLNCLI', 'Server=(local);Trusted_Connection=yes;',
     'EXEC _sp_cwm5_GetInvoiceDetail @CH_iBilling_Log_RecID')

我得到了错误

用于链接的 OLE DB 提供程序“SQLNCLI10” 服务器“(空)”返回消息 “不能推迟准备 完成。”。

我已经运行 sp_configure 'ad hoc..', 1 重新配置覆盖 以确保我可以针对 openrecordset 运行选择

任何想法我可能做错了什么? 提前致谢

【问题讨论】:

  • 看到那些游标了吗?你要去TSQL地狱! :)

标签: sql-server tsql


【解决方案1】:

错误的第一件事是您的“EXEC _sp_cwm5_GetInvoiceDetail @CH_iBilling_Log_RecID”语句将被评估为常量,而不是将@CH_iBilling_Log_RecID 的值传递给 OPENROWSET。您必须将整个“SELECT * INTO...”替换为字符串变量并在其上运行 sp_executesql。

第二个错误是您的“select into”语句每次都会创建 tarInvoiceDetail_201101,因为 INTO 在运行时会创建一个新表。因此,如果您的光标覆盖不止一行,您将在第二遍时收到错误。

另外,“Server=(local)”在这里代表什么?您是否尝试在连接到远程服务器时对 SQL Server 的本地副本使用 OPENROWSET?或者您是否尝试使用 OPENROWSET 来解决不能直接使用存储过程作为 INSERT 源的限制?

【讨论】:

  • Server=(local) 代表本地服务器实例。我正在尝试使用 openrowset 解决从存储过程中选择新表的问题
  • @phill:您如何解释您正在通过光标在循环内进行插入这一事实?您是否在循环结束时删除了该表?因为如果你不这样做,你不能再 SELECT INTO 它,那会产生错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多