Questions tagged «stored-procedures»

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

1
sp_prepexec(sp_execute)与sp_executeSQL
问题的实质:实际的存储过程是实现临时表缓存的唯一机制,还是sp_executeSQL/ 等系统存储过程sp_execute也利用了它们? 我不是DBA,所以请少说话。我们的应用程序发送了准备好的语句,这些语句从探查器中运行,我看到它运行所有SQL,sp_prepexec这是同时运行sp_prepare和的系统过程sp_execute。我要尝试做的是弄清楚我是否从临时表缓存中受益。 我一直在使用带有object_id()的本指南来检查行为 https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html 然后,此博客文章上的第3点表明EXEC无法使用临时表缓存,但忽略了sp_executeSQL是否可以:http : //blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-executesql.aspx 在通过客户端发送的查询中,我创建了一个简单的临时表。 DECLARE @foo int; -- set by JDBC, unused but required to force a prepared statement SELECT 1 AS id INTO #tmp SELECT OBJECT_ID('tempdb..#tmp'); 在探查器中,我可以看到: declare @p1 int set @p1=NULL exec sp_prepexec @p1 output,N'@P1 int',N'declare @foo INT = @P1 SELECT 1 …

3
在数据库表中使用SPID(而不是表变量)
用于预订事物的交易数据库... 我们的供应商被要求用@tablevariables替换#temptables(由于繁重的编译锁),但他们替换为一个实际表,该表将SPID作为列添加,以确保存储过程仅作用于适用的行。 您认为这种操作方法有任何风险吗?在所有事务都隔离在它们自己的事务中之前,我担心我们最终可能会将该表锁定一堆,但他们的意见是SQL使用行级锁定并且不会创建更多的锁。 SQL Server版本:2016 Enterprise-13.0.5216.0 CREATE TABLE dbo.qryTransactions ( ID int IDENTITY (0,1) NOT NULL CONSTRAINT pk_qryTransactions PRIMARY KEY CLUSTERED, spid int NOT NULL, OrderID int, ItemID int, TimeTransactionStart datetime, TimeTransactionEnd datetime, ...other fields ) CREATE INDEX idx_qryTransactions_spidID ON qryTransactions (spid, ID) INCLUDE (ItemID, OrderID, TimeTransactionStart, TimeTransactionEnd)

3
存储过程可以引用存储它的数据库吗?
假设我有一个存储过程,它在几个数据库中进行了重复的修改。而且我想引用存储过程存储在其中的数据库,即使它在另一个数据库中执行也是如此。 有没有办法检索完整路径(..)或以其他方式检索存储过程的数据库,而不是当前数据库?

1
我是否需要“停机时间”来更新存储过程?(由于“定义更改”错误)
我一直以为更新存储过程是我在用户积极使用系统时可以做的事情。 但是我目前正在测试存储过程的更新,并且正在执行对sproc的长时间运行的调用(调用时已超过4分钟),因此我更新了sproc。(我打算在单独的窗口中尝试其他查询计划。) 当我回到长期运行的机器时,出现了以下错误: The definition of object 'MySprocName' has changed since it was compiled. 该错误似乎表明,如果更新了该存储过程的定义,则任何正在执行的存储过程都会失败。(我认为,一旦存储程序开始运行,尽管定义有所更改,它将在其余的运行中使用该计划。) 这是真的?我是否需要停机才能更新存储过程的定义?

2
多个存储过程中的相同代码
我最近加入一家公司,我只是注意到许多存储过程在整个过程中都重复了相同的代码部分。我注意到了,因为我的任务是在每个发生的SP中更改该代码的一小部分:) 这是相当庞大的代码块,大约30行。该代码是插入语句的一部分,它基本上将4个表连接在一起,而WHERE/AND条件实际上并没有真正从SP变为SP。它看起来类似于以下内容: ... ... FROM <TableOne> INNER JOIN <TableTwo> ON ... AND ..... AND ..... LEFT JOIN <TableThree> ON ... AND ..... AND ..... WHERE ..... AND ..... AND ..... AND MedicalPlanCode IN ('abc', 'def', 'ghi') 从SP更改为SP的唯一部分是值(“ abc”,“ def”,“ ghi”) 这些值的数量也可以不同,因此某些SP的值为2,其他SP的值为5,等等。 我想到的所有内容都将那部分代码更改为动态SQL,但不确定是否值得。但是,我里面的程序员讨厌这种情况。 我应该尝试实现某种形式的代码重用吗?有投资回报率吗?我有什么选择?我不得不经历大约100个存储过程,这花了大约一个小时。 100个SP分布在20个左右的不同数据库中。我确实具有创建视图的权限。

2
用主键创建一个“ INTO”表
也许对于这个社区来说,我的问题很容易,但是对我(一个简单的Java程序员)来说,这是一个大问题。 我有一个越来越多的数据的大数据库。因此,外部数据库管理员创建了一个作业,该作业在临时表中向我显示所需的数据。但是他创建的表没有主键,当我的java项目去读取该表时,出现错误。 我无法读取此表,因为主键不存在。 我可以在不更改此复杂过程结构的情况下在过程中插入创建自动增量主键的可能性吗? 这是存储过程代码的开头: USE [MYDB] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER Procedure [dbo].[spSchedula_Scadenzario] as begin drop table MYDB.dbo.tmpTable select aa.* into MYDB.dbo.tmpTable from (...) 提前致谢

4
如何从存储过程完成之前获取响应?
我需要在完成之前从存储过程返回部分结果(作为简单选择)。 有可能这样做吗? 如果是,该怎么做? 如果没有,有什么解决方法? 编辑:我有该过程的几个部分。在第一部分中,我计算了几个字符串。我将在后面的过程中使用它们进行附加操作。问题是调用者需要尽快使用字符串。因此,我需要计算该字符串并将其传递回(以某种方式,例如通过选择),然后继续工作。调用方可以更快地获取其有价值的字符串。 呼叫者是一个Web服务。

3
当存储过程可以由不同的用户同时运行时,是否建议使用临时表?
我正在研究一种从活动目录检索objectGUID的存储过程。我将结果存储在临时表中,然后在输出参数中返回该值以用于其他进程。将通过不同的存储过程以及Web应用程序PHP,ASP Classic和ASP.Net调用SP。 我在这里读到(关于临时表): 如果在存储过程中创建,则它们将在存储过程完成时销毁。此外,任何特定临时表的范围都是创建该临时表的会话。表示仅对当前用户可见。多个用户可以创建一个名为#TableX的临时表,并且同时运行的任何查询都不会相互影响-他们将保持自主事务,而这些表保持自主对象。您可能会注意到我的示例临时表名称以“#”符号开头。 听起来我很高兴,但我想获得一些建议,以确保没有我不知道的陷阱。这是SP。 提前致谢。 CREATE PROCEDURE stp_adlookup @user varchar(100), @objectGUID varbinary(256) OUTPUT AS SET NOCOUNT ON; DECLARE @qry char(1000) CREATE TABLE #tmp( objectGUID nvarchar(256) ) SET @qry = 'SELECT * FROM openquery(ADSI, '' SELECT objectGUID FROM ''''LDAP://mydomaincontroller.com'''' WHERE sAMAccountName = ''''' + @user + ''''' '')' INSERT INTO …

3
MySQL可能创建全局例程(存储过程和/或函数)
是否可以以某种方式定义全局可用的例程?似乎每个例程都必须在数据库范围内创建。 当我尝试从控制台创建例程(没有发出之前use dbname)时,出现错误: ERROR 1046 (3D000): No database selected 我们有大量相同的数据库(数据不同),目标是为某些表名创建一些触发器。但是我们只想运行一个例程,所以我们不必为每个数据库都创建这些例程(由于它们是相同的,因此例程对于每个数据库都将起作用)。

1
在PL / pgSQL中声明表类型的变量
我想知道是否有一种方法可以在PL / pgSQL中声明类型表的变量来保存查询结果?例如,我如何表达这样的东西: q1 = select * from foo; q2 = select * from bar; for t1 in q1: for t2 in q2: -- do something with t1 and t2 我研究了return next构造,但似乎只能处理返回值。

3
SQL Server存储过程的条件编译
简短版:是否有某种方法可以使用Visual Studio 2010的SQL Server数据工具有条件地编译SQL Server数据项目中的TSQL代码块? 我正在Visual Studio 2010中使用SQL Server数据工具在实验性SQL Server Express数据库上工作。如果一切正常,最终的目标将是企业SQL Server平台。我在一个盒子上有一个2008实例,在另一个盒子上有一个2012实例,因为我的公司也正在从2008年迁移到2012年,以迁移许多企业数据库。 在我使用的其他编程语言中,预处理器指令使按条件编译部分代码库变得容易。最常见的用途是在受限制的部分中为不同的平台使用不同的代码,或者从发行版本中排除调试输出代码。 在我正在处理的某些存储过程中,这两个都可能非常有用。有这样的东西吗?我知道我可以sqlcmd在部署过程中使用变量交换特定的值,但是我不知道如何使用它来包含或排除随后的代码块。 例: #IF $(DebugVersion) = 'True' -- A bunch of useful PRINTs and what not #ELSE SET NOCOUNT ON #ENDIF #IF $(SSVersion) = '2012' SET @pretty_date = FORMAT(@some_date, 'dddd, MMM dd, yyyy') #ELSE SET @pretty_date = CAST(@some_date …

1
MySQL用户对存储过程的权限
我创建了一个简单的存储过程: mysql> CREATE FUNCTION hello (s CHAR(20)) -> RETURNS CHAR(50) DETERMINISTIC -> RETURN CONCAT('Hello, ',s,'!'); Query OK, 0 rows affected, 1 warning (0.00 sec) 但是无法运行它: mysql> SELECT hello('world'); ERROR 1370 (42000): execute command denied to user ''@'localhost' for routine 'test.hello' 我的用户名是否可能为空字符串?如何创建用户并授予特权?我可以授予用户数据库中所有实体的所有特权吗?


3
通过使用存储过程处理数据而不是将数据存储到检索后的函数中,是否可以提高性能?
标题进行了总结。我对PHP相当满意,并且可以轻松地使用MySQL的值来使其满足我的需要,但是为了扩展我的知识,我一直在想,这是否可能是一种更有效的技术。长跑。它们是否相等(由于最后的处理量大致相同),还是在某些情况下一个呈现出明显的优势?
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.