WHERE
子句中的条件。在我尝试清理源代码时,我试图创建一个基于给定条件返回表的存储过程,因此我可以将250个视图压缩到一个存储过程中。
老实说,我这样做的唯一原因是当我开始转换到新的数据库和前端时,我有一些预先制作的存储过程,而不是混乱的视图。 / p>
有没有办法可以执行我在当前现有视图中创建的存储过程,所以我不必修改它们的前端(通过ODBC连接到SQL Server的一系列访问数据库)?
我的存储过程如下所示:
CREATE PROCEDURE BusDuctQueries.CMSF_Current_Mod @ModNumber VARCHAR(255)
AS
SELECT [Date], [Name], [Mod], [Cell], [Row], [Section],
[Phase A Breaker Amps], [Phase B Breaker Amps], [Phase C Breaker Amps],
[Phase A Actual Amps], [Phase B Actual Amps], [Phase C Actual Amps],
[PDU # 1], [Bus Duct # 1],
[Bus Duct # 1 Phase A Current Load], [Bus Duct # 1 Phase B Current Load], [Bus Duct # 1 Phase C Current Load],
[PDU # 2], [Bus Duct # 2],
[Bus Duct # 2 Phase A Current Load], [Bus Duct # 2 Phase B Current Load], [Bus Duct # 2 Phase C Current Load],
[Sort 1], [Sort 2], [Average Load], [Percent Used], [Percent Remaining], [KW Used],
CONVERT(NUMERIC(18, 2), [Derated KW Left]) AS [Derated KW Left],
CONVERT(NUMERIC(18, 2), [True KW Left]) AS [True KW Left],
CASE WHEN [PDU # 1] LIKE '%A%' THEN 1 ELSE 2 END AS UPSSort
FROM BusDuctQueries.[CMSF Current]
WHERE ([Mod] = @ModNumber) AND (Cell NOT LIKE '%WP%')
答案 0 :(得分:2)
您无法从视图中调用存储过程。它不受支持。但是,您可以将视图调用其他视图,或table-valued user-defined functions。
对于后者,您必须确保使用inline functions。否则,将对动态生成的结果集执行任何后续条款,例如WHERE
,GROUP BY
和ORDER BY
。因此,您不会受益于索引搜索等。这可能会对性能产生巨大影响。
答案 1 :(得分:1)
有两种方法可以做到这一点,两者都有其优点和缺点:
使用OPENROWSET / OPENQUERY。这些允许你对你想要的任何东西做一个SELECT,但是 它可能具有您不喜欢的安全隐患。如果这可能不是问题 这是一个短期解决方案,之后您可以撤消允许“Ad Hoc” 分布式查询“。但这是最容易设置的,特别是如果结果集 在procs之间变化(假设有多个过程)。
编写执行该程序的SQLCLR TVF。如果是,则可以在SAFE模式下完成 存储过程是只读的(即没有INSERT / UPDATE / DELETE语句和大多数 可能没有CREATE #Tmp语句)。我写了一篇文章,展示了一个例子: Stairway to SQLCLR Level 2: Sample Stored Procedure and Function
答案 2 :(得分:0)
如果你想做一些繁重的工作,也许是操纵表变量,使用while循环等,那么使用你视图中的函数和引用。
您无法使用存储过程,因为存储过程可以编辑您的数据 - 如果您可以从视图中引用它们,那么选择可能会产生副作用 - 这是不允许的。
答案 3 :(得分:0)
您可以轻松地将此类程序转换为内联TVF,也称为参数化视图。视图的主体将与您在过程中的内容保持一致。
从视图/ TVF中选择与执行存储过程不同,因此您可能无论如何都必须更改前端。无论如何,有人必须提供参数值。