Questions tagged «stored-procedures»

安装在数据库管理器上的可调用代码,公开了可通过其调用的API。通常使用本地查询语言编写的某些DBMS平台也支持其他语言。

3
将公式存储在表中并在函数中使用该公式
我有一个PostgreSQL 9.1数据库,其中部分处理代理佣金。每个代理商都有自己的计算公式,他们可以得到多少佣金。我有一个函数来生成每个代理应获得的佣金数量,但是随着代理数量的增加,它变得无法使用。被迫做一些非常长的case语句和重复代码,这使我的功能变得非常庞大。 所有公式都有常量变量: d ..该月工作的天数 r ..新节点累积 l ..忠诚度得分 s ..子代理人佣金 b ..基本利率 我..获得的收入 公式可以是: d*b+(l*4+r)+(i/d)+s 每个代理商与人力资源部门协商付款方式。因此,我可以将公式存储在代理表中,然后像一个小的函数一样,仅从表中获取公式并将其转换为值并计算金额吗?

1
存储过程返回动态创建的表数据
简而言之,我们正在与具有调查系统的外部供应商合作。该系统不一定设计得最好,因为当您创建新调查并创建新表时,即: Tables ____ Library_1 -- table for Survey 1 SurveyId int InstanceId int Q_1 varchar(50) Library_2 -- table for Survey 2 SurveyId int InstanceId int Q_2 int Q_3 int Q_4 varchar(255) 这些表用所生成的SurveyId在名称的末尾(Library_)和问题列与所产生的QuestionId在它(结束Q_)。 为了明确起见,问题存储在单独的表中,因此尽管问题ID是连续的,但对于每个调查来说,问题ID都不从1开始。问题列将基于表中分配给它们的ID。 看起来查询起来非常简单,除了我们需要从所有调查表中提取数据以发送到另一个系统外,这就是问题所在。由于这些表是在前台添加新调查时自动创建的,最终应用程序,其他系统无法处理这种类型的结构。他们需要数据是一致的以便消费。 因此,我的任务是编写一个存储过程,该过程将从所有Survey表中提取数据并将其放置为以下格式: SurveyId InstanceId QNumber Response ________ __________ _______ ________ 1 1 1 great 1 2 1 …

3
您如何找到使用存储过程的位置(在其他存储过程中)
我在具有数千个SP的数据库中有一个要重构的存储过程。有没有一种快速的方法可以在其他SP中找到对该存储过程的引用,因此我可以确定重构时不会破坏任何其他代码。 在应用程序代码中,我可以很容易地找到对SP的调用,并且可以对定义SP的所有各种sql文件进行文本搜索,但是数据库中可能有一些SP可能会被这种方式错过。 编辑:我要查找的存储的过程是包的一部分。 编辑:我在Oracle 11g上运行


2
ORDER BY CASE表达式出现“转换失败”错误
当我将“ OrderBy”设置为“ OrderNumber”时,以下存储过程可以很好地发挥作用。 我收到以下错误:将nvarchar值'SK11270'转换为数据类型int时转换失败。 (SK11270是OrderNumber列中的值,为nvarchar(50)) 如果我对任何其他OrderBy列运行相同的查询,则工作正常。 我完全迷路了,我的头很痛。谁能看到任何明显的原因会导致此问题? 预先感谢您的任何想法... 丰富 这有效: sp_jobs '1','20','','JobNumber','ASC','97','True','True','True','True','True','True','True','True','True','False','True','False','True','False','0' 这不是: sp_jobs '1','20','','OrderNumber','ASC','97','True','True','True','True','True','True','True','True','True','False','True','False','True','False','0' PROCEDURE [dbo].[sp_Jobs] @PageNumber int, @PageSize int, @FilterExpression varchar(500), @OrderBy varchar(50), @OrderDirection varchar(50), @CustomerID int, @ShowNotSet bit, @ShowPlaced bit, @ShowProofed bit, @ShowReProofed bit, @ShowApproved bit, @ShowOnTime bit, @ShowLate bit, @ShowProblem bit, @ShowCompleted bit, @ShowDispatched bit, @ShowUnapproved …

2
sp_msforeachdb在后台如何工作?
我需要解决我遇到的问题,并且需要一些帮助来了解sp_msforeachdb的工作方式以解决我的问题。 每次我运行sp_msforeachdb时,都会发生错误 Msg 102, Level 15, State 1, Incorrect syntax near '61' 我的代码示例如下: EXEC SP_msforeachdb 'SELECT ''?'' AS Database FROM ?.sys.objects WHERE name like ''%aetna%'' 但是,我将什么查询作为sp_msforeachdb的参数并不重要。每次我遇到相同的错误。我确实有一个以'61s1d'开头的数据库,所以我认为它的数据库名称有问题,但是老实说我不知道​​sp_msforeachdb的幕后情况。 注意事项。 它是唯一一个以数字开头的数据库 我可以尝试使用“如果数据库像'%61%'那样不要执行......”之类的代码,但是仍然会出现相同的错误。 我无法测试更改数据库名称的情况-与之连接的东西太多了。 如果我创建一个以“ 51”开头的测试数据库,那么我也会得到该数据库的错误 我该如何克服?

1
使用xml参数更新多个数据时,如何避免使用合并查询?
我正在尝试使用值数组更新表。数组中的每个项目都包含与SQL Server数据库中的表中的一行相匹配的信息。如果表中已经存在该行,则使用给定数组中的信息更新该行。否则,我们在表中插入新行。我已经基本描述了upsert。 现在,我试图在采用XML参数的存储过程中实现这一目标。我使用XML而不是表值参数的原因是因为这样做,我将不得不在SQL中创建自定义类型并将该类型与存储过程相关联。如果我曾经更改过存储过程或数据库模式中的某些内容,则必须重做存储过程和自定义类型。我想避免这种情况。此外,TVP优于XML的优势对我的情况没有用,因为我的数据数组大小永远不会超过1000。这意味着我无法使用此处提出的解决方案:如何在SQL Server 2008中使用XML插入多个记录 另外,这里的类似讨论(UPSERT-MERGE或@@ rowcount是否有更好的替代方法?)与我要的内容有所不同,因为我试图将多行插入表中。 我希望我可以简单地使用以下查询集从xml向上插入值。但这是行不通的。仅当输入为单行时,才应采用这种方法。 begin tran update table with (serializable) set select * from xml_param where key = @key if @@rowcount = 0 begin insert table (key, ...) values (@key,..) end commit tran 下一个替代方法是使用穷举的IF EXISTS或其以下形式的变体之一。但是,我以效率不佳为由拒绝了这一点: IF (SELECT COUNT ... ) > 0 UPDATE ELSE INSERT 下一个选择是使用Merge语句,如下所述:http …

2
如何编写引用链接服务器的可移植SQL?
我有一个引用链接服务器的存储过程。在整个过程的几个地方,我都有类似以下内容: INSERT INTO [TableName] (...Columns...) SELECT ...Columns... FROM [ServerName\InstanceName].[Catalogue].[dbo].[TableName] WHERE TableNameID = @TableNameID 此过程存在于我的开发环境,测试环境和实时环境中。 问题在于该过程的每个副本都略有不同,因为每个环境的服务器名称都不同。这使得管理脚本更新的部署很麻烦。 有没有办法使该过程具有可移植性,以便每个环境都可以运行该过程的相同版本? 如果没有,我是否可以做些什么来使脚本部署不易出现错误/错误?

2
mysql.proc不断崩溃,无法执行mysqldump吗?
由于InnoDB的某些问题,我将所有数据库转储到新服务器上: mysqldump -E -R --all-databases | pv -b | mysql -u root -p -h new.server 转储过程因错误而停止: 59.9kB assword: 59.9kB ERROR 145 (HY000) at line 2970: Table './mysql/proc' is marked as crashed and should be repaired 228MB mysqldump: Got errno 32 on write 我运行了以下命令来修复所有数据库中的所有表: mysqlcheck --auto-repair --all-databases 当我检查mysql.proc状态时,会得到: mysql> check table …

4
我如何知道哪个存储过程或触发器正在使用SQL Server 2008 R2上的表?
就是这种情况,在我正在检查的数据库中,有一个保存用户历史记录的存档表,并且有一个触发器或存储过程,在一段时间后,从该表中删除行,以避免该表过大。同样,我没有设计数据库,我只是在维护使用该数据库的应用程序,所以我不知道这些存储过程或触发器的名称,我要做的是找到该存储过程或触发,请检查代码并对其进行修改,以使此“用户历史记录”在表上保留的时间更长。 有人告诉我检查“ sysobjects”表,在那里我实际上可以看到具有相同名称的表,但这是我唯一能够检索到的信息,有什么建议吗? 谢谢。

2
如何使用临时表或表变量将SQL Server存储过程迁移到Oracle?
受管理层鼓励的C#开发人员编写SQL Server存储过程时,通常会产生这样的过程 create table #t1 (...); insert into #t1 Select ... from table_a where ...; insert into #t1 Select ... from table_b where ...; update #t1 Set ... = ... where ... Select * from #t1; 单个语句非常简单,这种方法使它们产生正确的结果。 通常,我的任务是将此类过程迁移到Oracle。 让我们面对以下事实。 SQL Server中的不同临时表是完全独立的,可以具有任何临时结构。 Oracle全局公用表是全局对象,并且所有共享表都使用相同的表结构。修改此结构是不可能的,尽管它可以在任何地方使用。 我从Oracle dba中学到的一件事是避免在可能的情况下使用临时表。这样的修改甚至可以提高SQL Server的性能。 用活接头替换单个插件 在最简单的情况下,以上内容可以转换为 select case when …

2
究竟何时有多个用户无法同时使用临时表运行存储过程?
我对最近在TechNet上阅读的有关Temp Tables的文档有疑问。该页面上“ 临时表”部分的第四段内容如下: 如果使用命名约束创建了一个临时表,并且该临时表是在用户定义的事务范围内创建的,则一次只能有一个用户可以执行创建临时表的语句。例如,如果存储过程创建具有命名主键约束的临时表,则该存储过程不能由多个用户同时执行。 我在这样一个环境中工作:我们大量使用了一些使用索引临时表的存储过程,而我们从未遇到过用户必须等待一个执行完成才能开始下一个执行的问题。我希望情况会继续如此,但我担心,如果未正确理解此警告,可能会成为一个问题。 具体来说,我不清楚以下几点: 这仅适用于全局临时表还是局部临时表?一个在会话外部不可见的表(在后一种情况下)会阻止另一个会话同时执行,这似乎很奇怪。 什么才算是“命名约束”?并非所有约束都具有名称(即使它们是系统生成的)?这是否指的是具有用户定义别名的约束?对我来说,这似乎是措辞不好。 “多个用户”实际上意味着多个会话吗?这些过程是通过使用单个服务帐户的应用程序调用的,因此99.9%的脚本调用是由该单个帐户进行的(对于管理员偶尔在后端进行的调用,我并不担心)。如果服务帐户可以同时在多个会话中运行该存储过程,那么出于我的目的,这个问题就没有意义了。

6
并行运行存储过程
我正在尝试尝试同时使用不同的参数多次运行相同的存储过程。 我正在使用SQL 2014 这样做的原因是该过程大约需要7个小时才能完成。实际上,它多次执行相同的过程。因此,例如,它可能会为每个分支建立一个新的数据库和表。 我想要做的是分解存储过程,这样我可以在每个分支中运行,但随后并行运行每个查询。我已经通过在单独的查询窗口中运行它进行了测试,并且运行速度快了将近80%。 谁能给我一个虚拟的指南,以并行运行查询?

1
MySQL->遍历表,在每个条目上运行存储过程
我有一个包含“书籍”(儿童短篇小说)的数据库,对书籍中每个单词的字数统计将非常有用。 我想出了如何使用以下方法获得每个单词的单词计数: SELECT SUM ( ROUND ( (LENGTH(pageText) - LENGTH (REPLACE (pageText, "Word", ""))) /LENGTH("Word") ) ) FROM pages WHERE bookID = id; 这对于计数单词非常有用。但是,这需要我仔细阅读每本书,找出每个单词,然后通过该功能运行它(我将其保存为存储过程。) 我有一个包含每个单词的表格,没有重复。 我的问题:有没有办法使用存储过程在Words表上执行某种“ for each”循环? 即。向存储过程传递一个书ID和一个单词并记录结果。为每本书做每个字。这样可以节省大量的手动时间...这甚至是我应该从数据库方面做的事情吗?我应该用PHP代替吗? 老实说,任何输入都将不胜感激!

4
如何通过Linux终端创建mysql存储过程
在mysql控制台中,我们将使用delimiter命令更改定界符,这对定义过程很有用。我了解 delimiter仅适用于mysql客户端的命令(客户端命令)。 但我使用不具有该命令的MySQL客户端delimiter 一样dbslayer,对这种客户我该怎么定义程序。 现在考虑: create procedure test_pro() begin select 'hello pro'; end 我尝试了以下方法: mysql -u root -pmypass test < proc_file 其中proc_file包含以上过程; 但这给了我以下错误: ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.