问题标签 [stored-procedures]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
10 回答
31041 浏览

sql-server - 对我的 SQL Server 存储过程进行版本控制的最佳方法是什么?

对我的数据库对象进行版本控制的最佳方法是什么?我正在使用 Visual Studio 2005/2008 和 SQL Server 2005。我更喜欢可以与 SVN 一起使用的解决方案。

0 投票
4 回答
34397 浏览

sql - 在 SQL Server 中找出调用存储过程

是否可以找出谁调用了存储过程?

例如,假设我在proc3. 从该过程中,我想知道它是否由proc1or调用proc2

0 投票
15 回答
73912 浏览

sql - SQL 存储过程中的动态排序

这是我过去花费数小时研究的问题。在我看来,现代RDBMS解决方案应该解决的问题,但到目前为止,我还没有发现任何东西可以真正解决我认为在任何具有数据库后端的 Web 或 Windows 应用程序中非常普遍的需求。

我说的是动态排序。在我的幻想世界中,它应该像这样简单:

这是新手 SQL 和存储过程开发人员在 Internet 上的各个论坛上给出的典型示例。“为什么这不可能?” 他们问。ORDER BY总是有人最终过来向他们讲授存储过程的编译性质、一般的执行计划,以及不能将参数直接放入子句的各种其他原因。


我知道你们中的一些人已经在想什么:“那么让客户进行分类吧。” 自然地,这会从您的数据库中卸载工作。不过,在我们的案例中,我们的数据库服务器在 99% 的时间里都没有出过汗,它们甚至还不是多核的,也不是每 6 个月对系统架构进行的任何其他无数改进。仅出于这个原因,让我们的数据库处理排序不会有问题。此外,数据库非常善于分类。他们针对它进行了优化,并且多年来一直在做正确的事情,执行它的语言非常灵活、直观和简单,最重要的是任何初学者 SQL 编写者都知道如何去做,更重要的是他们知道如何编辑它,进行更改,进行维护等。当您的数据库远没有被征税并且您只想简化(并缩短!)开发时间时,这似乎是一个明显的选择。

然后是网络问题。我玩过 JavaScript 可以对 HTML 表进行客户端排序,但它们不可避免地不够灵活,无法满足我的需求很难证明重写或滚动我自己的 JavaScript 排序器所花费的时间是合理的。服务器端排序通常也是如此,尽管它可能已经比 JavaScript 更受欢迎。我不是特别喜欢 DataSets 开销的人,所以起诉我。

但这又带回了不可能的观点——或者更确切地说,不容易。在以前的系统中,我已经完成了一种令人难以置信的动态排序方式。它既不漂亮,也不直观、简单或灵活,并且初学者 SQL 编写者会在几秒钟内迷失方向。这已经不是一个“解决方案”,而是一个“并发症”。


以下示例并不意味着展示任何最佳实践或良好的编码风格或任何东西,也不代表我作为 T-SQL 程序员的能力。它们就是它们,我完全承认它们令人困惑,形式不好,而且只是简单的黑客攻击。

我们将一个整数值作为参数传递给存储过程(让我们将参数称为“排序”),并从中确定一堆其他变量。例如...假设 sort 为 1 (或默认值):

您已经可以看到,如果我声明更多 @colX 变量来定义其他列,我真的可以根据“sort”的值对要排序的列进行创意......使用它,它通常最终看起来像下面令人难以置信的混乱条款:

显然,这是一个非常精简的例子。真正的东西,因为我们通常有四到五列来支持排序,除此之外,每列可能还有第二列甚至第三列(例如日期降序,然后按名称升序排序),并且每列都支持双列定向排序,有效地使案例数量增加一倍。是的……它很快就长毛了。

这个想法是,人们可以“轻松”更改排序情况,以便在 storagedatetime 之前对车辆 ID 进行排序......但伪灵活性,至少在这个简单的例子中,真的到此为止。本质上,每个未通过测试的案例(因为我们的排序方法这次不适用于它)呈现一个 NULL 值。因此,您最终会得到一个功能如下的子句:

你明白了。它之所以有效,是因为 SQL Server 按子句的顺序有效地忽略了空值。这很难维护,任何对 SQL 有任何基本工作知识的人都可能看到。如果我失去了你们中的任何一个,请不要难过。我们花了很长时间才让它工作,但我们仍然对尝试编辑它或创建类似的新东西感到困惑。值得庆幸的是,它不需要经常更改,否则它很快就会变得“不值得麻烦”。

然而它确实奏效了。


我的问题是: 有没有更好的方法?

我对存储过程以外的解决方案没有意见,因为我意识到这可能不是要走的路。最好,我想知道是否有人可以在存储过程中做得更好,但如果没有,你们都如何处理让用户使用 ASP.NET 动态排序数据表(也可以双向)?

感谢您阅读(或至少略读)这么长的问题!

PS:很高兴我没有展示我的存储过程示例,该示例支持动态排序、列的动态过滤/文本搜索、通过 ROWNUMBER() OVER 进行分页,尝试...捕获错误时的事务回滚... “庞然大物”甚至还没有开始描述它们。


更新:

  • 我想避免动态 SQL。将字符串解析在一起并在其上运行 EXEC 会首先破坏存储过程的许多目的。有时我想知道这样做的缺点是否不值得,至少在这些特殊的动态排序情况下。尽管如此,每当我做这样的动态 SQL 字符串时,我总是觉得很脏——就像我仍然生活在经典的 ASP 世界中一样。
  • 我们首先需要存储过程的很多原因是为了安全。我不能就安全问题打电话,只建议解决方案。使用 SQL Server 2005,我们可以在架构级别对单个存储过程设置权限(如果需要,基于每个用户),然后直接拒绝对表的任何查询。批评这种方法的利弊也许是另一个问题,但这又不是我的决定。我只是主要的代码猴子。:)
0 投票
3 回答
3673 浏览

sql - 存储过程所有权链接

我的数据库中有几个存储过程,用于从位于单独数据库中的数据集市加载数据。这些程序通常采用以下形式:

当我在 SQL Server Management Studio 中执行查询时,这些运行良好。当我尝试使用 EXEC load_stuff 执行它们时,该过程失败并出现安全警告:

服务器主体“the_user”无法在当前安全上下文下访问数据库“data_mart”。

sproc 的 OWNER 是 dbo,即 the_user(为了我们的示例)。两个数据库的 OWNER 也是 the_user 并且 the_user 映射到 dbo(这是 SQL Server 应该做的)。

为什么我会在 SQL Server 中看到此错误?这是因为有问题的用户被别名为 dbo 并且我应该使用不同的用户帐户进行跨数据库数据访问?

编辑 我知道这是因为 SQL Server 默认禁用跨数据库所有权链接,这很好。但是,我不确定在这种情况下的最佳做法。如果有人对此方案的最佳实践有任何意见,将不胜感激。

编辑 2 最终的解决方案是在两个数据库上都设置 TRUSTWORTHY ON。这允许在两个数据库之间进行有限的所有权链接,而无需诉诸完整的数据库所有权链接。

0 投票
3 回答
548 浏览

delphi - 在现金流报告中替换存储过程的想法

我们有一个现金流量报告,基本上是这样的结构:

主要问题是余额,由于我们使用 DataSet 作为数据,计算 DataSet 上的余额有点困难,因为我们总是需要前一天的余额。

此外,这些数据来自多个表,并且很难维护此过程,因为数据库元数据经常更改。

任何人都可以给我一些可能的不同解决方案吗?问题?

此报表显示在 DataGrid 上。

0 投票
4 回答
12379 浏览

sql - 存储过程位参数激活附加 where 子句以检查 null

我有一个看起来像这样的存储过程:

不用说,这是行不通的。如何激活检查 @AdditionalFilter 参数的附加 where 子句?谢谢你的帮助。

0 投票
8 回答
1070 浏览

java - 是否有类似于 Java/.Net 分析器的 SQL Server 分析器?

我喜欢分析 Java/.Net 应用程序以发现性能瓶颈或内存问题的方式。例如,通过查看调用树以及每个方法的执行时间和调用计数,很容易找到性能瓶颈。在 SQL Server 中,我有存储过程调用其他依赖于视图的存储过程,这类似于 Java/.Net 方法调用其他方法。所以看起来同一种探查器在这里会很有帮助。然而,我四处张望,一个也找不到。是否有人知道此类工具,无论是用于 SQL Server 还是任何其他 DBMS?

更新:感谢您对 SQL Server Profiler 的回复,但此工具非常有限。看看截图

0 投票
3 回答
8364 浏览

c# - 存储过程默认值

当谈到 SQL 时,我是一个新手。在创建具有以下参数的存储过程时:

这是 T-SQL 中默认值的正确形式吗?我尝试使用 NULL 而不是 ''。

当我尝试通过 C# 执行此过程时,我收到一个错误,指的是预期但未提供描述这一事实。当这样调用它时:

结果。描述为空。这不应该在 SQL 中默认为 NULL(在我的情况下是 '')吗?

这是调用命令:

0 投票
3 回答
2924 浏览

c# - 为什么我需要 OleDbCommand.Prepare()?

我正在使用通过存储查询(名为“UpdatePaid”,如下所示的 3 个参数)与 MSAccess 表对应的数据网格和适配器,如下所示:

它工作正常......但真正奇怪的是,直到我输入odc.Prepare()调用它才起作用。因此,我的问题是:在使用 OleDb 存储的过程/查询时,我是否需要一直这样做?为什么?我还有另一个项目即将推出,我必须用 SqlDbCommand 做同样的事情......我也必须用这些做吗?

0 投票
4 回答
5381 浏览

sql - 是否可以确定 SQL Server 2000 中最后一次修改存储过程的时间?

我知道你可以在 SQL Server 2005 中做到这一点,但我对 2000 年不知所措。