关于sql server 2008:无法将存储过程的结果导入到#TempTable中

Cannot get results of a stored procedure into a #TempTable to work

本问题已经有最佳答案,请猛点这里访问。

我正在使用SQL Server 2008 R2,正在尝试将存储过程的结果获取到一个临时表中,稍后可以在调用存储过程中访问该临时表。我的TSQL如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE PROCEDURE sp_ToBeCalled AS
(
   @SomeParam INT
)
BEGIN
    SELECT * FROM tblSomeTable WHERE SomeField = @SomeParam
END


CREATE PROCEDURE sp_CallingProcedure AS
(
   @SomeOtherParam INT
)
BEGIN
    -- A
    SELECT * INTO #MyTempTable FROM sp_ToBeCalled(@SomeOtherParam)

    -- B
    SELECT * FROM #MyTempTable FOR XML RAW
END

但是,当我调用sp_callingprocedure语句-b时,这一切都编译得很好,返回一个错误,这个错误是我想要的。

我怎样才能做"a",这样我就可以从一个可诱惑的表中访问它的结果,而不必先声明可诱惑的结构?

我正在寻找一个我可以通用的解决方案。我有许多现有的存储过程,需要从不同的调用方调用这些过程,在这些调用方中,获取可查询的结果是必要的。我无法更改现有的存储过程。

我不想用

  • OPENQUOERY()—需要自定义链接服务器定义
  • sp_ExecSql()—意味着我必须建立动态SQL,而这不会给我提供sp编译时检查。

  • 您试图使用一个类似表格函数的过程。

    尝试使用

    1
    2
    INSERT INTO #MyTempTable (column1, column2...)
    exec sp_ToBeCalled(@SomeOtherParam)


    很好的参考:http://www.sommarskog.se/share_data.html

    我通过以下步骤部分解决了我的问题:

    1)将行集选择到全局临时表中的自定义存储过程2)调用sp调用1),然后将GlobalEmptable转换为本地可供处理的

    这是可行的,但有以下"问题":

    • 由于需要启用"临时分布式查询"功能,因此可能存在安全风险
    • 仍然需要一个全局临时表,该表需要由调用方清理。临时表命名也有问题,因为多个2)将导致问题。

    我在下面包含我的代码,以防它帮助其他人。如果有人能改进,请随时发帖。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    /* This requires Adhoc Distributed Queries to be turned on:
       sp_configure 'Show Advanced Options', 1
       GO
       RECONFIGURE
       GO
       sp_configure 'Ad Hoc Distributed Queries', 1
       GO
       RECONFIGURE
       GO
    */


    -- Adapted from: http://stackoverflow.com/questions/653714/how-to-select-into-temp-table-from-stored-procedure

    CREATE PROCEDURE [dbo].[ExecIntoTable]
    (
        @tableName          NVARCHAR(256),
        @storedProcWithParameters   NVARCHAR(MAX)
    )
    AS
    BEGIN
        DECLARE @driver         VARCHAR(10)
        DECLARE @connectionString   NVARCHAR(600)
        DECLARE @sql            NVARCHAR(MAX)
        DECLARE @rowsetSql      NVARCHAR(MAX)

        SET @driver = '''SQLNCLI'''

        SET @connectionString =
            '''server=' +
                CAST(SERVERPROPERTY('ServerName') AS NVARCHAR(256)) +
                COALESCE('\' + CAST(SERVERPROPERTY('InstanceName') AS NVARCHAR(256)), '') +
            ';trusted_connection=yes;Database=' + DB_NAME() + ''''

        SET @rowsetSql = '''EXEC ' + REPLACE(@storedProcWithParameters, '''', '''''') + ''''



        SET @sql = '
    SELECT
        *
    INTO
        '
    + @tableName + '
    FROM
        OPENROWSET('
    + @driver + ',' + @connectionString + ',' + @rowsetSql + ')'

        EXEC (@sql)
    END
    GO

    然后在另一个SP中使用,如下所示:

    1
    2
    3
    4
    5
    6
    7
    EXEC ExecIntoTable '##MyGlobalTable', 'sp_MyStoredProc 13, 1'
    SELECT *
    INTO #MyLocalTable
    FROM ##MyGlobalTable
    DROP TABLE ##MyGlobalTable

    SELECT * FROM #MyLocalTable