Questions tagged «stored-procedures»

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

2
存储过程中的事务
我需要在单个事务中执行UPDATE和INSERT。该代码本身可以正常工作,但是我希望能够轻松地调用它并传递所需的参数。当我尝试将此事务嵌套在存储过程中时,我遇到许多语法错误。 如何封装以下代码,以便可以轻松调用它? BEGIN TRANSACTION AssignUserToTicket GO DECLARE @updateAuthor varchar(100) DECLARE @assignedUser varchar(100) DECLARE @ticketID bigint SET @updateAuthor = 'user1' SET @assignedUser = 'user2' SET @ticketID = 123456 UPDATE tblTicket SET ticketAssignedUserSamAccountName = @assignedUser WHERE (ticketID = @ticketID); INSERT INTO [dbo].[tblTicketUpdate] ([ticketID] ,[updateDetail] ,[updateDateTime] ,[userSamAccountName] ,[activity]) VALUES (@ticketID, 'Assigned ticket to …

1
将存储过程的结果插入表变量
我有一个存储过程,将值存储在表变量中。我选择这些值并在调用过程时将其返回。 我试图在另一个表变量中设置这些返回值,但我无法弄清楚。 存储过程 ALTER PROCEDURE [dbo].[GetOrSetDomainId] @DomainName varchar(50), @DomainUrl varchar(50) AS BEGIN DECLARE @DomainId bigint; DECLARE @NumberOfRwos bigint; DECLARE @DomainHistory TABLE ( DomainId bigint, HasHistory bit, ServerOnline bit, DatabaseOnline bit, ServerPerformance bigint, DatabasePerformance bigint, SoldTickets bigint ) SELECT @NumberOfRwos = COUNT(Id) FROM DomainData WHERE DomainName = @DomainName OR DomainUrl = …

1
在PostgreSQL 8.4中执行触发功能需要哪些特权?
在PostgreSQL 8.4中执行触发功能需要哪些特权? 似乎为角色设置的特权与执行触发功能无关紧要。我想我已经看到有一天执行触发器功能所需的特权是EXECUTE特权,但对于表的所有者而言,而不是执行触发触发器的触发器的实际角色。 我找不到说明这一点的文档部分,有什么帮助吗?

1
错误:在无法接受集合的上下文中调用了set_valued函数。什么事啊
我在ubuntu 12.04上使用Postgresql 9.1。 克雷格的回答启发,我的问题类型SETOF或SETOF纪录的级联我以为我会使用顺利return query,setof record等一系列的发电机到这个PLPGSQL功能: create or replace function compute_all_pair_by_craig(id_obj bigint) returns setof record as $$ begin return query select o.id, generate_series(0,o.value) from m_obj as o; end; $$ language plpgsql; 在执行过程中,我得到了错误: ERROR: set_valued function called in context that cannot accept a set 怎么了 ?与Craig相反,我告诉函数返回setof record。 我可以实现与Craig完全一样的工作,即通过定义类型create type pair_id_value as …

3
在MS SQL数据库中记录庞大的相互关联的存储过程Web:什么工具或格式?
我希望这是一个比“阅读一千页的书”更短的答案的问题,但是,如果那是真实的情况,那就来问我。 我不是真正的DBA,我是一名软件开发人员,他意识到我们需要DBA,但我工作的商店的DBA为零。但是,我们的MS SQL数据库设计(包括几个核心存储过程)非常混乱。存储过程很慢,我们怀疑它们存在错误,但是我们甚至不知道它们应该如何工作,因此我们不知道如何修复它们。 首先,我决定将所有工作方式记录下来,然后开始单元测试,并建立一组单元测试,以帮助证明存储过程确实有效。他们执行的逻辑是我们应用程序的关键部分,您可以说,这是公司主要产品的“皇冠上的宝石”,并且其工作方式完全没有记载。 我正在寻找专业的DBA可能期望存在的特定技术文档,或者如果需要的话,可能会写自己理解一些相互调用的庞大的存储过程。 记录大型存储过程的通常格式是什么?每个In参数的期望值的描述(即“先决条件”,“后置条件”,即布尔参数,当您打开或关闭它时会发生什么变化,等等?) 通常如何记录它?仅SQL注释?特定于目的的外部工具?外部“文档”?除了MS SQL Management Studio,我们没有其他SQL工具,但是我们想知道是否有一种工具可以更好地理解,记录和测试我们的环境。也许这是问我问题的更好方法。我需要什么工具来解决我们的困境? 我们的目标是能够: 答:使用我们生成的文档或我们添加到环境中的任何工具来帮助理解这些过程应该如何工作,因此我们可以继续为存储过程创建单元测试范围。 B.向客户端应用程序开发人员展示如何正确调用这些复杂的存储过程。 C.对我们的存储过程进行单元测试。

5
SQL Server存储过程是否缓存数据结果?
我从朋友那里听说过,但是我从未调查过这是否正确。 是否将已执行查询的数据结果存储在缓存中? 我的意思是,如果我有一个存储过程,如: SELECT * FROM USERLIST ...是将结果(在这种情况下为用户列表)存储在高速缓存中是真的吗? 另外,如果我有这些: SELECT * FROM USERLIST WHERE user="user" SELECT * FROM USERLIST WHERE user="userzzz" (其中将user / userzzz作为参数传递),是否在数据库缓存中存储了2个不同的结果是否正确。 我不这么认为,但我希望得到您的确认,专家!

1
PLS-00306错误:如何找到错误的参数?
PLS-00306:“字符串”调用中参数的数量或类型错误 原因:当命名的子程序调用不能与该子程序名称的任何声明匹配时,会发生此错误。子程序名称可能拼写错误,参数可能具有错误的数据类型,声明可能有误,或者声明可能不正确地放置在块结构中。例如,如果使用错误的名称或错误的数据类型参数调用内置平方根函数SQRT,则会发生此错误。 操作:检查子程序名称的拼写和声明。还要确认其调用正确,其参数具有正确的数据类型,并且,如果不是内置函数,则将其声明正确放置在块结构中。 如何快速确定错误的论点? 我有一个带有数十个参数的存储过程。有没有一种简便的方法来检查所用过程与已定义过程之间的差异?我不想逐行检查。



2
是否有人使用SQL Server功能创建按数字区分的存储过程组?
问题是指此msdn文档中的number参数 如果不这样做,则可以在SQL Server中创建多个存储过程(按数字区分),然后将其删除。 create procedure dbo.stored_proc1 as select 1 go create procedure dbo.stored_proc1;2 as select 2 go exec stored_proc1 -- returns 1 go exec stored_proc1;2 -- returns 2 go drop stored_proc1 -- drops both go 我想知道这个功能是否被任何人用于有用的东西,或者仅仅是出于历史的好奇心。

3
SQL Server插入到-如何识别导致截断错误的列
我有一个存储过程,将650个字段插入表中。插入失败,出现截断错误。 很简单 INSERT INTO SELECT (a bunch of fields) FROM (a bunch of tables) 下面是错误消息: 消息8152,级别16,状态14,过程DSP_Procedure,行1075字符串或二进制数据将被截断。 有没有一种快速的方法可以确定导致截断错误的字段? 要插入到表中的select语句具有650个字段的事实使得很难查明哪个字段导致截断错误。 我在想我可以一次注释掉字段块,以便一次仅将SP插入100个字段,然后在不同的时间运行SP 6或7次,直到我至少可以缩小到100个字段的组将包含导致截断错误的字段。 或者,我在想,也许我只能SELECT INTO新建一个表,然后将表中的数据长度与要插入到SP中的目标表的数据长度进行比较,以查看哪个字段包含的字段长度超出预期的字段长度。 .. 我正在使用SQL Server 2014。 还有更简单的选择吗?

4
如何使用存储过程为日期范围内的每一天创建一行?
我想创建一个存储过程,该过程将在给定日期范围内的每一天在表中创建一行。存储过程接受两个输入-用户所需日期范围的开始日期和结束日期。 因此,假设我有一个像这样的表: SELECT Day, Currency FROM ConversionTable Day是DateTime,而Currency只是一个整数。 为了简单起见,我们总是希望对于每个插入的行,“货币”列为1。因此,如果有人输入“ 2017年3月5日”作为开始日期,并输入“ 2017年4月11日”作为结束日期,我希望创建以下行: 2017-03-05 00:00:00, 1 2017-03-06 00:00:00, 1 ... 2017-04-11 00:00:00, 1 对存储过程进行编码的最佳方法是什么?我在测试环境中使用SQL Server 2008 R2,但实际环境中使用SQL Server 2012,因此,如果2012年引入了新功能,可以简化此任务,则可以升级测试计算机。

5
更改架构后如何检测损坏的存储过程?
我已经在数据库中修改了一个中央表,并且sp_depends确实返回了数百个结果,而且我担心其中的一些存储过程在更改后可能无法再编译。 检查一个存储过程很容易(我只是重新运行alter脚本,然后查看操作是否成功),但是在100多个过程中执行此操作比较麻烦。 我知道我可以使用像这样的脚本来重新编译数据库中的所有对象,但是实际操作将在下一次执行存储过程时发生,而不是立即执行,因此对于我来说似乎不合适。 我还以为我可以完全删除所有存储过程,并使用源代码控制系统重新同步数据库,但是该选项虽然可行,但却不是一个很好的选择。有更好的方法吗? 我正在使用SQLServer 2008 R2,我的数据库脚本存储在VS 2008数据库项目中。 需要澄清的是,我并不是在主张应该完全依靠这种方法来测试代码。就像在C#中一样,您在编写代码时会立即检测其他依赖文件中的语法错误(然后使用其他策略进行测试,例如单元测试,通常速度要慢几个数量级),我认为检测SQL依赖关系很有意义错误只需几秒钟即可完成,而不必运行通常需要几个小时才能完成的完整功能测试。

2
MySQL中触发器与存储过程的性能
关于DBA.StackExchange(触发器在记录上保留修订号的最佳实践是什么?)的一篇文章引发了一个关于MySQL性能的有趣的问题(至少对我来说很有趣)。 上下文是我们要在表中为每个更新的行插入一条记录。在更新该行之前,我们要存储一个先前的值,然后递增其中一列(“版本”列)。 如果我们在触发器中执行此操作,则效果很好。对于MySQL,触发器是逐行的,因此这是一个简单的解决方案。选择表中当前的数据,将其插入日志记录表,然后更新新数据中的“版本”列。 但是,可以将此逻辑移至存储过程。如果这样做,您将执行插入操作,然后增加表中的“版本”列。整个事情将基于设置。 因此,在执行此插入操作时,使用基于集合的存储过程方法或基于触发器的方法会更有效吗? 这个问题是针对MySQL的(因为它具有逐行触发器),尽管它可以应用于其他逐行触发器DBMS。

3
谁创建了程序?(SQL Server 2008 R2)
有没有办法列出谁在SQL Server 2008中创建了某些过程? 在此SO链接中有一些答案,但来自6年之前。 我知道写下您的姓名和日期,然后开始创建程序是最好的做法,但是我在工作的地方看不到它。 如果没有办法执行此任务,是否可以使用触发器来完成此任务? 还有一个奖金问题。这是dba的工作吗?知道是谁创造的? 非常感谢你。

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.