【问题标题】:Could EXEC and Select Into work together?EXEC 和 Select Into 可以一起工作吗?
【发布时间】:2018-09-20 10:46:43
【问题描述】:

我正在运行以下语句以从远程服务器获取结果

EXEC  ( @var)  AT [linkedservername] 

注意: @var 保存选择查询以在链接服务器上运行。 Linkedserver 是 DB2 服务器。

我想将结果保存到一个临时表中。

有可能吗?

我们可以实现如下吗?

EXEC  ( @var)  AT [linkedservername]  into #t

-- 向提供者更新更多信息。

我想出了这个,

从文件中读取查询。

使用链接服务器在所需的 DB2 服务器中执行它。

现在我需要将它保存在一个 temptable 中

DECLARE @FileContents  VARCHAR(MAX)

SELECT @FileContents=BulkColumn
FROM   OPENROWSET(BULK'E:\ADDRESS.txt',SINGLE_BLOB) x;

set @FileContents = Replace(@FileContents,'''''','''')

set @FileContents = @FileContents + ' FETCH FIRST 1 ROWS only'

EXEC    ( @FileContents)  AT [linkedservername]   

我需要类似下面的东西,

select * from (
    EXEC    ( @FileContents)  AT [linkedservername]   )

【问题讨论】:

  • 我已经为 Select into not insert into 寻求帮助。链接用于插入。我已经在使用它,因为该表结构必须已经创建,但在我的情况下查询是动态的
  • 重新打开了问题。
  • 所以现在我不能再把它当作骗子关闭了,但这是一个可能的答案:stackoverflow.com/a/21141083/3094533

标签: sql tsql sql-server-2014


【解决方案1】:

已更新以获取新信息。

对于您尝试这样做的方式,答案是否定的。 如果您已经知道结构,请先创建临时表。您可能必须更改 RPC 和 DTC 设置才能使调用正常工作。

CREATE TABLE #temp
(<Table definition for your results>)

DECLARE @var VARCHAR(100)= 'your command'

INSERT INTO #temp EXEC (@var) AT TRANSACCOUNT

SELECT * FROM #temp

如果您不知道结构,您可以使用 OPENROWSET 或 OPENQUERY 动态生成表。

开放查询:

SELECT  * 
INTO #temp FROM    
OPENQUERY(targetServer, 'your command')

开放行集:

SELECT  * INTO
  #temp
FROM
  OPENROWSET(
    'SQLNCLI',
    'Server=targetServer;Trusted_Connection=yes;',
    'your command'
)
SELECT * FROM #temp

OPENQUERY 和 OPENROWSET 需要字符串文字,因此如果您需要动态设置基本命令,您还需要构建您的 OPENROWSET 调用。调用的上下文也会改变任何临时表的上下文,因此您可以使用 temporary 永久表来存储您的结果,如下所示:

DECLARE @var VARCHAR(100)= 'your command'
DECLARE @command VARCHAR(MAX)

SELECT @command = CONCAT(
'SELECT  * INTO  temporaryTable
FROM
  OPENROWSET(
    ''SQLNCLI'',
    ''Server=targetServer;Trusted_Connection=yes;'',
    ''', @var,'''
)')
EXEC (@command)
SELECT * FROM temporaryTable

【讨论】:

  • 表结构未知.. 运行查询后我只能得到它
  • 我遇到过 openrowset 但最终出现此错误消息 7399,级别 16,状态 1,第 26 行链接服务器“(null)”的 OLE DB 提供程序“SQLNCLI11”报告了错误。身份验证失败。消息 7303,级别 16,状态 1,第 26 行无法初始化链接服务器“(null)”的 OLE DB 提供程序“SQLNCLI11”的数据源对象。
  • 注意:我在 DB2 服务器上运行它可能是因为它可能会失败。想到将 sql 提供程序更改为 db2 提供程序
  • 是的,SQLNCLI11 适用于 SQL Server 的本机客户端。我没有要验证的 DB2 环境,但我相信它看起来像这样 OPENROWSET('IBMDADB2' ,'DSN=yourDSN;UID=yourUser;pwd=yoruPass;' ,'your command
猜你喜欢
  • 2014-09-11
  • 2013-07-09
  • 2016-01-29
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多