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",这样我就可以从一个可诱惑的表中访问它的结果,而不必先声明可诱惑的结构?
我正在寻找一个我可以通用的解决方案。我有许多现有的存储过程,需要从不同的调用方调用这些过程,在这些调用方中,获取可查询的结果是必要的。我无法更改现有的存储过程。
我不想用
您试图使用一个类似表格函数的过程。
尝试使用
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 |