代码之家  ›  专栏  ›  技术社区  ›  vignesh

EXEC和Select可以一起工作吗?

  •  1
  • vignesh  · 技术社区  · 6 年前

    EXEC  ( @var)  AT [linkedservername] 
    

    注: @var保存要在链接服务器上运行的select查询。

    我想保存成一个诱人的结果。

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

    --正在更新提供程序详细信息。

    我想到这个,

    从文件读取查询。

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

    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]   )
    
    1 回复  |  直到 4 年前
        1
  •  3
  •   GreyOrGray    6 年前

    更新以获取新信息。

    答案是否定的方式,你试图这样做。 如果您已经知道了结构,那么首先创建temp表。您可能必须更改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调用。调用的上下文还将更改任何临时表的上下文,因此可以使用 暂时的 存储结果的永久表如下所示:

    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