【问题标题】:Manage SQL Server stored procedures in Visual Studio在 Visual Studio 中管理 SQL Server 存储过程
【发布时间】:2017-05-02 13:54:39
【问题描述】:

众所周知,就性能而言,建议使用 SQL Server 存储过程而不是内联代码。但是,出于各种原因,我仍然在 Visual Studio 中使用内联 SQL 查询:

  • 查询可以整齐地组织在单独的文本文件 (.sql) 和文件夹结构中。
  • 这些文件是 Visual Studio 解决方案的一部分,因此提交给源代码管理。
  • 对 SQL 查询的更改可以与应用程序一起发布(对于 ASP.NET 应用程序使用 WebDeploy,对于 Windows 应用程序使用 ClickOnce)。
  • 无需同步对 SQL 查询的更改和发布新版本的应用程序。
  • 即使我处于离线状态(或无法访问该特定 SQL Server),它也使我能够处理 SQL 查询。

我还没有准备好放弃这些优势,但我仍然知道我正在牺牲性能。

有没有办法两全其美?

提前感谢您提供任何见解。

克里斯

【问题讨论】:

  • 您可以在 Visual Studio 中创建一个 SQL 项目。这至少将它们置于源代码控制之下,并允许您组织它们并离线处理它们。
  • 您可以将存储过程定义存储为文本文件(在我的上一个项目中,我们经常这样做,将它们存储为过程的 .sqlp、函数的 .sqlf 和视图的 .sqlv,只是这样我们' d知道什么是什么)。在我的新工作中,我们在 Visual Studio 中使用 SQL 数据库项目,它可以完成所有这些工作并且更方便一些,因为您可以直接将其与数据库同步,因此您可以在 Visual Studio 中编写更改,然后像发布一个应用程序,您可以让它记录它在发布操作期间运行的脚本,这样您就有了审计线索。
  • @ADyson 只是为了始终识别文件类型,我将我的命名为 usp_{procName}.sql(用于存储过程)或 uf_{functionName}.sql 或 uv_{viewName}.sql .这样您就知道它是什么文件类型,并且您可以保留 .sql 扩展名以便“识别”它
  • @ganders 好点。但是他们(比我早 10 年)编写了一个完全自定义的小脚本,该脚本将从预定义的文件夹结构中读取文件,查看文件扩展名以了解如何处理它,然后部署它。它可以一键完成整个预补丁,代码更新,补丁后部署运行文件夹结构。所以扩展识别的问题并不是真正的问题,正如工具所期待的那样。我只是设置我的编辑器将扩展关联为 SQL 文件。
  • 这是一个众所周知的、有据可查的神话,即存储过程会比类似的适当参数化 内联 T-SQL 查询。这只是不是这样!停止传播这个神话......

标签: c# asp.net sql-server visual-studio


【解决方案1】:

从字面上看,您的每一点都可以由存储过程提供......您不仅可以拥有一个带有 CREATE 或 ALTER 命令的 .sql 文件,用于存储过程,就像您现在管理它的方式一样,但您可以更进一步,使用 SQL 数据库项目类型以更好的方式部署它们...

https://msdn.microsoft.com/en-us/library/xee70aty(v=vs.140).aspx

但我会注意到,存储过程并不会自动提高性能...如果您阅读此内容,可能是因为它们更容易参数化,因此可以重新执行计划。使用正确的参数化查询您将获得相同的好处,所以我认为您的问题的基本前提是不正确的。

【讨论】:

    【解决方案2】:

    我仍然在 Visual Studio 中使用内联 SQL 查询...

    但是怎么做呢?上下文在这里很重要。 VS 只是一个工具。如果您在应用程序中使用内联查询,那么如果您不小心如何实现它们(re: sql injection),那么您将面临潜在的安全风险。此外,使用内联查询需要对数据库对象具有适当的权限——这是另一个安全风险。这种方法会在您的代码和架构之间创建依赖关系 - 通过使用过程可以最大限度地减少这种依赖关系。

    【讨论】:

    • 他说他将它们存储在 .sql 文件中,所以我认为他的意思是“内联”,因为它们是文本,而不是他实际上将它们硬编码到他的 C# 代码文件中......所以我没有t 认为您的 cmets 与此处相关(尽管它们总体上非常明智!)
    • 确实,它们并不是真正的内联。它们是存储在单独的 .sql 文件中的参数化查询。然后,我将这些 SQL 文件“导入”到资源文件中,使我能够像 'var command = new SqlCommand(SqlQueries.searchTheseObjects)' 一样调用它们并添加类型化(到参数嗅探)参数,从而防止 SQL 注入。
    • 避免参数嗅探)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多