【问题标题】:SQL Server - replace view with stored procedureSQL Server - 用存储过程替换视图
【发布时间】:2016-09-12 21:16:39
【问题描述】:

我有一个封闭源代码的 ASP.NET 系统,它正在调用一个非常昂贵的 SQL 视图:

SELECT TOP 100 PERCENT * 
FROM [v]  
WHERE [u] =  9999 
ORDER BY [ID]

我可以访问数据库,所以我可以更改视图 - 没有简单的方法可以让视图更快。

我想根据正在执行请求的 IIS 服务器以编程方式更改视图的行为。

这可能吗?

例如我想创建一个从视图调用的存储过程,这个存储过程将返回一个模拟当前视图的表,但如果从特定的 IIS 服务器调用将返回不同的东西。

是否可以修改视图以调用存储过程,使 asp.net 代码不需要任何修改?

我可以从其他堆栈溢出文章中看到如何从视图中调用存储过程,但是如何访问存储过程中的 where 子句?

【问题讨论】:

  • “从视图调用存储过程”是什么意思?这对我来说根本没有任何意义。您不会通过使用存储过程而不是视图来神奇地加快速度。您最有可能添加一些适当的索引。请发布表和索引定义,我们可以提供帮助。
  • "选择前 100 %"?这只是愚蠢的开始。您不会从内部视图中调用 procs(因此是之前的评论)。您可以创建一个存储过程并将服务器名称传递给它,然后根据该参数执行不同的选择。但是您仍然需要修改 .NET 代码来调用过程而不是视图。简短的回答,据我所知,您尝试做的事情是不可行的。
  • 视图是一种结构化查询,SQL 将其视为类似于表(许多例外),因为它封装了查询的逻辑。您不能调用更改视图结构的 proc(那时它不会是视图),但您可以使用 proc 返回一个按您想要的方式工作的查询。我想问题是你需要持久查询吗?是否有一些需要它的报告工具?另外,关于DDL,下次请咨询MSDN。虽然这个Query vs View 很好
  • 一些例外情况适用,但简单地说,视图是一个可重用的查询。
  • 返回表类型的用户定义函数。

标签: sql-server tsql


【解决方案1】:

鉴于您的 ASP.NET 代码可能嵌入了 Select * From [view] 代码并且您无法更改它,因此您面临以下障碍:

  1. 您需要创建一个多语句表值函数,该函数可以检测您从哪个 IIS 实例查询,而无需来自应用程序的任何定制输入(例如,查看用户或服务帐户、IP 地址) .使用多语句表值视图的好处是,您实际上可以创建两个单独的 Select 语句,然后有条件地返回一个或另一个。您也可以在存储过程中执行此操作,但我认为您会发现从视图调用多语句表值函数比存储过程更简单。

  2. 您需要更改视图以从新的多语句表值函数中执行 Select *。

注意事项

当您更改应用程序使用的视图的定义时,您还将更改访问它的任何其他用户或应用程序的视图。 Here 是关于如何查看谁在使用特定视图以及使用频率的讨论。我建议您查看您是否有任何其他应用程序或报告工具从该视图中提取,因为更改底层代码可能会破坏这些其他应用程序。

【讨论】:

    猜你喜欢
    • 2017-01-26
    • 2020-12-19
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多