Questions tagged «stored-procedures»

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

6
存储过程的突然执行计划
我试图了解SQL Server 2000所遇到的问题。我们是一个中等交易量的网站,我们有一个存储的proc调用sp_GetCurrentTransactions,它接受一个customerID和两个日期。 现在,根据日期和客户,此查询可以返回从零到1000s的行。 问题是:我们经历过的是,突然之间Execution Timeout Expired,当特定客户端尝试执行该存储的proc时,我们将获得许多错误(通常是类似错误)。因此,我们检查了查询,在SSMS中运行该查询,发现它花费了30秒。因此,我们重新编译存储的proc,然后-bang-它现在可以在300ms内运行。 我已经与我们的DBA谈过此事。他告诉我,当我们创建存储的proc时,数据库创建了一个查询计划。他说这对那组参数来说是一个很好的计划,但是如果您向它扔一些参数,那么该计划将不是该数据的最佳计划,因此您会发现它运行缓慢。 呈现给我的选项是将问题查询从存储的proc转移回动态SQL,该SQL具有每次运行时创建的执行计划。 这感觉就像是退后了一步,我觉得必须有一种解决方法。还有其他方法可以解决此问题吗? 任何和所有答复表示赞赏。

2
为什么查询在存储过程中比在查询窗口中运行慢?
我有一个复杂的查询,它在查询窗口中运行2秒钟,但作为存储过程大约5分钟。为什么以存储过程的形式运行需要花费更长的时间? 这是我的查询的样子。 它采用一组特定的记录(由@id和标识@createdDate)和特定的时间范围(从开始的1年@startDate),并返回已发送信件的摘要列表以及由于这些信件而产生的估计付款。 CREATE PROCEDURE MyStoredProcedure @id int, @createdDate varchar(20), @startDate varchar(20) AS SET NOCOUNT ON -- Get the number of records * .7 -- Only want to return records containing letters that were sent on 70% or more of the records DECLARE @limit int SET @limit = IsNull((SELECT Count(*) …

2
Varchar的行为,末尾有空格
当我将Varchar与空格一起使用时,它最后会忽略空格。 例如: declare @X varchar(50) 这个... set @X= 'John' ...是相同的... set @X= 'John ' 它认为这些是相等的。如何使系统将它们识别为不同的?

1
是什么允许SQL Server用对象名称交换传递给系统过程的字符串
是什么导致将对象名称传递给系统存储过程合法sp_helptext呢? 什么机制将对象名称转换为字符串? 例如 -- works sp_helptext myproc sp_helptext [myproc] sp_helptext [dbo.myproc] -- and behaves the same as a string sp_helptext 'myproc' sp_helptext 'dbo.myproc' -- does not work sp_helptext dbo.myproc -- Msg 102, Level 15, State 1, Line 1 incorrect syntax near '.' -- an additional case that does not work. …

5
在SQL Server中,有一种方法可以确定传递给正在执行的存储过程的参数的值
确定执行存储过程的一种方法是使用“动态管理”方法,如下所示: SELECT sqlText.Text, req.* FROM sys.dm_exec_requests req OUTER APPLY sys.dm_exec_sql_text(req.sql_handle) AS sqltext 但是,这仅显示存储过程的create语句的文本。例如: CREATE PROCEDURE IMaProcedure @id int AS SELECT * FROM AllTheThings Where id = @id 理想情况下,我想查看正在运行的过程的参数是什么,从而导致该过程对于特定的有问题的参数集运行了这么长时间。 有没有办法做到这一点?(在此问题中, Aaron Bertrand提到了DBCC InputBuffer,但我认为这不适用于此问题。)

2
sp_send_dbmail存储过程带有附件发送
我的任务是向其中一位客户发送一份小型月度报告。该报告以前是在实例上手动运行的,输出已复制到电子表格中并作为附件发送给客户。 我正在寻找一个更永久的解决方案,因此我打算使用sp_send_dbmail存储过程来运行查询并将其作为附件发送。 一切正常,但消息格式正确。最初,我尝试将输出附加为带有CSV文件的CSV文件,@query_result_seperator = ','但结果无处不在! 当我正常运行报表时,在SQL中输出看起来不错。但是,将其作为CSV或仅在邮件正文中发送就没有了。 我认为如果将输出导出为HTML并以附件/或XML格式发送输出可能会更好,但是我不知道该怎么做。 有没有人有什么建议? 提前致谢!

3
如果我不删除临时内存表,该表将保留多长时间(MySQL)
我在MySQL中使用递归存储过程来生成名为的临时表id_list,但我必须在后续的select查询中使用该过程的结果,因此无法DROP在该过程中使用该临时表... BEGIN; /* generates the temporary table of ID's */ CALL fetch_inheritance_groups('abc123',0); /* uses the results of the stored procedure in the WHERE */ SELECT a.User_ID FROM usr_relationships r INNER JOIN usr_accts a ON a.User_ID = r.User_ID WHERE r.Group_ID = 'abc123' OR r.Group_ID IN (SELECT * FROM id_list) GROUP BY …

2
sp_executesql何时刷新查询计划?
您必须原谅我的天真,因为我不是DBA,但我的理解是,随着时间的推移,必须重新编译数据库更改和存储过程的统计信息,以使查询计划与最新的统计信息保持最新。 假设我的数据库中有一个存储过程,可以按一定的时间间隔对最新的统计信息进行重新编译,那么将存储过程内联到代码中并将其包装在sp_executesql语句中的含义是什么?在重新编译过程的过程中,是否会丢失对查询计划的刷新? 如果在进行此更改之前我还有其他需要考虑的事项(权限除外),那么感谢您的见解。 我在MSDN上阅读过: SQL Server查询优化器将新的Transact-SQL字符串与现有执行计划进行匹配的能力受到字符串文本中参数值不断变化的影响,特别是在复杂的Transact-SQL语句中。 因此,假设我尝试进行内联和包装的存储过程sp_executesql确实包含一些参数,这是否表示尽管我的执行计划已被缓存,但使SQL Server很难找到并重用它?

1
在SQL Server Profiler中进行跟踪时,是否可以在过程调用中记录传入的参数值?
我正在尝试使用SQL Server Profiler(我正在使用SQL Server 2012)来生成有用的跟踪,以显示参数值,而不仅仅是显示带有变量名的SQL。该存储过程将遍历大量库存数据,以产生一些非常有价值的结果,而我正尝试记录现有行为,因此我可以对其进行单元测试,准确定义,然后将其重构为合理的形式。 我有一个执行54参数子过程的存储过程,该过程在一个循环内,在该循环中该存储过程创建一个游标,然后执行while循环。这是一个简化的视图: CREATE PROCEDURE [dbo].[OuterProcedure] ( @ProductCode varchar(8), -- 41 more parameters omitted ) AS SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SET NOCOUNT ON DECLARE @AboutFourHundredLocalvariables -- omit about 400 local variable declarations. -- OMIT ABOUT 10 temporary table declarations. DECLARE aCursor CURSOR FAST_FORWARD FOR SELECT …



1
为什么在存储过程的末尾截断临时表以更快地创建其可用的tempdb空间?
SQL Server缓存在存储过程中创建的临时表,并仅在过程结束并随后执行时重命名它们。我的问题与何时释放tempdb空间有关。我已经知道该表在过程结束时被截断了。我已经读到评论说,这是基于每个会话进行处理的,并且看到了有关是否需要在MSDN上进行清理的问题。但是,如果它从未在同一会话中两次执行过,该怎么办? 我还听说过,有一个后台垃圾收集过程,一旦表超出范围,就会释放该空间。 尽管有相反的预期,但在创建存储过程的末尾截断一个临时表时,似乎导致该表在tempdb中用于释放数据的空间比没有使用truncate语句时要快。为什么? 使用或不使用这样的截断语句对性能的影响是什么?使用SNAPSHOT隔离时,经常会感到tempdb压力,我认为尽快从大型temp表中释放tempdb中使用的空间将防止tempdb的不必要增长。这种潜在的空间节省是以性能为代价的吗? 这是一些重现此问题的代码(主要来自@TheGameiswar,但有一些更改): SET NOCOUNT ON; GO ALTER PROC usp_test AS BEGIN IF object_id('tempdb..#temp') IS NOT NULL DROP TABLE #temp SELECT * INTO #temp FROM [dbo].[Event_28] -- This is a table with 15313 rows, using 35648 KB according to sp_spaceused --SELECT SUM(user_object_reserved_page_count) AS [user object pages used] …

2
如何删除名称不明确的程序?
我正在使用信息提示... 我不知道我是怎么做的,但是数据库中有两个同名的过程。当我尝试用 DROP PROCEDURE myProc; 然后我收到一条错误消息 ERROR: Routine (add_adr_trigger_row) ambiguous - more than one routine resolves to given signature. Error Code: -9700 我如何取消该程序?

5
如何限制一个人一次可以运行的SQL存储过程?
我有一个存储过程,基本上从一个表中选择值,然后将它们插入到另一个表中,这是一种归档。我想避免多个人同时执行此操作。 在运行此过程时,我不希望其他任何人都可以启动该过程,但是我不希望序列化,而在完成后,其他人可以运行该过程。 我想要的是给其他尝试启动该程序的人,同时我正在运行该程序。 我已经尝试过使用sp_getapplock,但是我无法完全阻止该人运行该过程。 我还尝试使用sys.dm_exec_requests查找该过程并阻止该过程,尽管这确实可行,但我认为它不是最佳选择,因为在某些服务器上我没有运行sys.dm_exec_sql_text(sql_handle)的权限。 我这样做的最佳方法是什么?


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.