【问题标题】:View results of Stored Procedure查看存储过程的结果
【发布时间】:2013-09-15 14:52:38
【问题描述】:

我有一个执行动态构建的字符串的存储过程。

它将来自我无法控制的另一台服务器上不断变化的架构中的几个选择语句联合起来(因此是动态字符串)。我希望能够从视图中访问此过程的结果,但这就是我卡住的地方。

我创建了一个存储过程(下面的代码),它将我的结果输出到一个表中,但是我希望能够执行连接等,所以如果有某种方法可以将它包装到一个视图中,那将非常方便 -我正在考虑一个表值函数,但我还没有完全弄清楚如何将动态 SQL 放入函数中......感谢任何帮助!

CREATE PROCEDURE [dbo].[usp_test]
 AS
 SET NOCOUNT ON;
DECLARE @sql VARCHAR(MAX) 

SELECT @sql = ISNULL(@sql+'

','')+'SELECT TOP (900) *
                                   FROM   OPENQUERY(Linked_Server, 
                                                  'SELECT   col1, col2, col3

FROM dbo.'+  tableName+'
               +'
               UNION' FROM  dbo.ls_views

--dbo.ls_views is a view with the pertinent views/table names from the other server.

Set @sql = @sql+ '
Select top (0) ''1'', ''2'',''3'' from sys.tables '           
--last select statement is to end multiple unions... not sure if there is a better way, but this works.

    --PRINT (@sql);
        --EXEC  (@sql);
EXECUTE sp_Executesql @sql
    GO

【问题讨论】:

  • 旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免 sp_ 并使用其他东西作为前缀 - 或者根本不使用前缀!
  • 马克,你是对的。我急于用“虚拟”代码替换我的代码。
  • 由于您已经在使用链接服务器,因此您可以在执行存储过程时使用 OPENQUERY 检索结果:SELECT * FROM OPENQUERY(Linked_Server, 'EXEC [dbo].[usp_test]')

标签: sql sql-server stored-procedures dynamic view


【解决方案1】:

您可以让 SQL 代理定期执行此操作并将结果转储到数据库中的另一个表/表集吗?

然后你可以在任何你想要的查询中使用它作为直接连接。

【讨论】:

  • 我想过这个,但是底层的部分经常变化,所以我真的很想访问“实时”数据。这确实是我的后备计划。
  • Db 架构多久更改一次?
  • 它会有所不同,有时几个小时内完全没有,然后可能在几分钟内几次。如果无法动态访问它,我将安排一个 SQL 代理作业定期将结果转储到表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
相关资源
最近更新 更多