我一直在学习相当长的一段函数和存储过程,但我不知道为什么,当我应该用一个函数或存储过程。 他们期待着同样的我,也许是因为我对此感到有点新手。
有人能告诉我为什么吗?
我一直在学习相当长的一段函数和存储过程,但我不知道为什么,当我应该用一个函数或存储过程。 他们期待着同样的我,也许是因为我对此感到有点新手。
有人能告诉我为什么吗?
函数计算的值,并且不能执行到SQL服务器永久环境变化(即没有INSERT或UPDATE语句允许)。
函数可以内嵌在SQL语句中,如果它返回一个标值,或可根据它是否返回一个结果集被接合来使用。
值得注意的一点自评,这概括了答案。 由于@Seanķ安德森:
功能遵循计算机sciency定义,他们必须返回值,不能改变他们收到的参数(参数)的数据。 函数不允许改变什么,必须至少有一个参数,并且必须返回一个值。 存储特效不必有一个参数,可以改变数据库对象,而不必返回值。
SP和UDF之间的差被列举如下:
+---------------------------------+----------------------------------------+
| Stored Procedure (SP) | Function (UDF - User Defined |
| | Function) |
+---------------------------------+----------------------------------------+
| SP can return zero , single or | Function must return a single value |
| multiple values. | (which may be a scalar or a table). |
+---------------------------------+----------------------------------------+
| We can use transaction in SP. | We can't use transaction in UDF. |
+---------------------------------+----------------------------------------+
| SP can have input/output | Only input parameter. |
| parameter. | |
+---------------------------------+----------------------------------------+
| We can call function from SP. | We can't call SP from function. |
+---------------------------------+----------------------------------------+
| We can't use SP in SELECT/ | We can use UDF in SELECT/ WHERE/ |
| WHERE/ HAVING statement. | HAVING statement. |
+---------------------------------+----------------------------------------+
| We can use exception handling | We can't use Try-Catch block in UDF. |
| using Try-Catch block in SP. | |
+---------------------------------+----------------------------------------+
函数和存储过程服务于不同的用途。 虽然它不是最好的比喻,功能可以从字面上看,你会在任何编程语言使用的其他功能,但存储的特效更喜欢单独的程序或批处理脚本。
功能通常具有一个输出和任选的输入。 输出然后可以(一个SQL Server内置如DATEDIFF,LEN,等)用作输入到另一个功能或作为断言到SQL查询-例如, SELECT a, b, dbo.MyFunction(c) FROM table
或SELECT a, b, c FROM table WHERE a = dbo.MyFunc(c)
。
存储的特效是用来在事务SQL查询结合在一起,接口与外面的世界。 框架如ADO.NET等不能直接调用的函数,但是他们可以直接调用存储过程。
功能确实有隐患,但:他们可能被误用而造成相当恶劣的性能问题:考虑这个查询:
SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)
凡MyFunction的声明为:
CREATE FUNCTION MyFunction (@someValue INTEGER) RETURNS INTEGER
AS
BEGIN
DECLARE @retval INTEGER
SELECT localValue
FROM dbo.localToNationalMapTable
WHERE nationalValue = @someValue
RETURN @retval
END
这里发生的是,该函数myFunction是要求在表MyTable的每一行。 如果MyTable的有1000行,那么这就是对数据库的另一个1000即席查询。 同样,如果在列规范中指定的函数被调用,则该函数将被调用由SELECT返回的每一行。
所以你必须要小心书写功能。 如果你在一个函数表选择,你要问自己是否能与父存储过程或其他一些SQL构造(如CASE一个加入...时,可以更好地进行... ELSE ...结束)。
写一个用户定义函数时要计算并返回在其他SQL语句中使用的值; 当你想,而不是是一个组可能-复杂的SQL语句的编写存储过程。 这是两个非常不同的使用情况,毕竟!
存储过程和用户定义的函数之间的差异:
RAISEERROR
或@@ERROR
在UDF是不允许的。 GETDATE()
不能在UDF的使用。 基本区别
函数必须返回一个值,但在存储过程是可选的(程序可以返回零倍或正的值)。
功能可以具有用于它仅输入参数,而程序可以具有输入/输出参数。
函数采用一个输入参数是强制性的,但存储过程可能需要O与N的输入参数..
功能可以从程序调用的程序,而无法从函数被调用。
高级差异
程序允许选择和DML(INSERT / UPDATE / DELETE)在其声明中,而功能只允许SELECT语句中它。
过程不能在SELECT语句中被使用,而功能可以嵌入在一个SELECT语句。
存储过程不能在SQL语句中使用的任何地方WHERE / HAVING / SELECT部分,而功能即可。
返回表函数可以被视为另一行集。 这可以用来与其他表的连接。
内联函数可以但作为接受参数,可以在连接和其他行集操作中使用的意见。
异常可以由try-catch块在操作步骤进行处理而try-catch块不能在功能中使用。
我们可以去事务管理程序,而不能在功能去。
资源
STORE PROCEDURE FUNCTION (USER DEFINED FUNCTION)
* Procedure can return 0, single or | * Function can return only single value
multiple values. |
|
* Procedure can have input, output | * Function can have only input
parameters. | parameters.
|
* Procedure cannot be called from | * Functions can be called from
function. | procedure.
|
* Procedure allows select as well as | * Function allows only select statement
DML statement in it. | in it.
|
* Exception can be handled by | * Try-catch block cannot be used in a
try-catch block in a procedure. | function.
|
* We can go for transaction management| * We can't go for transaction
in procedure. | management in function.
|
* Procedure cannot be utilized in a | * Function can be embedded in a select
select statement | statement.
|
* Procedure can affect the state | * Function can not affect the state
of database means it can perform | of database means it can not
CRUD operation on database. | perform CRUD operation on
| database.
|
* Procedure can use temporary tables. | * Function can not use
| temporary tables.
|
* Procedure can alter the server | * Function can not alter the
environment parameters. | environment parameters.
|
* Procedure can use when we want | * Function can use when we want
instead is to group a possibly- | to compute and return a value
complex set of SQL statements. | for use in other SQL
statements.
一个用户定义函数可用到SQL Server程序员的一个重要工具。 您可以在SQL语句中内嵌使用它像这样
SELECT a, lookupValue(b), c FROM customers
其中lookupValue
将是一个UDF。 使用存储过程时,这种功能是不可能的。 同时,你不能做一个UDF内部的某些东西。 这里要记住的基本的事情是,UDF的:
存储过程可以做这些事情。
对于我一个UDF的内联用法是UDF的最重要的用途。
存储过程 使用的脚本 。 他们跑系列为你的命令,你可以安排他们在特定时间运行。
函数作为方法。 你通过它的东西,它返回一个结果。 应该是小而快 - 它的飞行。
存储过程:
EXEC
或EXECUTE
语句。 OUT
参数。 功能:
只能用来选择记录。 但是,它可以很容易地从标准SQL,如中调用:
SELECT dbo.functionname('Parameter1')
要么
SELECT Name, dbo.Functionname('Parameter1') FROM sysObjects
对于简单的可重复使用的选择操作,功能可以简化代码。 只是要小心使用JOIN
在功能条款。 如果你的函数有一个JOIN
子句,你从返回多个结果另一个SELECT语句调用它,该函数调用将JOIN
的表一起在结果集中返回的每一行。 所以,虽然他们可以在简化了一些逻辑有用,他们也可以是一个性能瓶颈,如果他们不正确使用。
OUT
参数。 要决定何时使用何种以下几点可能会帮助 -
存储过程不能返回表变量,其中的功能可以做到这一点。
您可以使用存储过程与使用功能,你不能在那里改变服务器环境参数。
干杯
SQL Server的功能,如游标,旨在作为你最后的武器! 他们确实有性能问题,因此使用表值函数应避免尽可能。 谈到性能谈论与超过100万点的记录托管在一个中产阶级的硬件服务器上的表; 否则,你不必担心造成功能的性能命中。
进一步参考参见: http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html
开始与返回单值函数。 这种做法的好处是,你可以把经常使用的代码放到一个函数,并返回它们作为一个结果集的一列。
然后,你可以使用一个功能城市的参数列表。 dbo.GetCitiesIn(“NY”)返回,可用于为连接的表。
这是组织代码的方式。 当事情是知道重复使用,当它是在浪费时间,只有通过试错和经验的东西。
此外,功能是在SQL Server是一个好主意。 它们是速度更快,可以说是相当强大的。 内联和直接选择。 小心不要过度使用。
这里有一个实际的理由,更喜欢在存储过程的功能。 如果您有需要另一个存储过程的结果的存储过程,你必须使用一个插入-exec语句。 这意味着,你必须创建一个临时表和使用exec
语句来插入存储过程的结果到临时表。 它的混乱。 与此一个问题是, 嵌入高管不能嵌套 。
如果你坚持与调用其它存储过程的存储过程,你可能会碰到这一点。 如果嵌套的存储过程只是返回一个数据集,它可以用一个表值函数来代替,你会不会再出现此错误。
( 这是另一个原因,我们应该保持业务逻辑从数据库中 )
函数可以在SELECT语句中作为其中的程序无法使用。
存储过程需要输入和输出参数,但功能只需要输入参数。
函数不能返回类型的text,ntext,图像和时间戳值,其中的程序即可。
在创建表,但过程不能功能可以作为用户定义的数据类型。
***如:-create table <tablename>(name varchar(10),salary getsal(name))
这里getsal是用户定义的函数返回一个工资的类型,在创建表时没有存储分配给工资类型,则也不会执行getsal功能,但是,当我们从该表中,getsal函数来获取的获取一些值执行,返回类型返回结果集。
我意识到这是一个非常古老的问题,但我没有看到一个重要的方面中的任何问题的答案中提到:内联到查询计划。
功能可以...
标量:
CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END
多语句表值:
CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END
内嵌表值:
CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...
第三类(内嵌表值)的查询优化处理,基本上如(参数化)的观点,这意味着从你的查询参照的功能类似于复制粘贴功能的SQL体(不实际的复制粘贴),领先以下好处:
上述可导致潜在的节省显著性能,结合的功能的多个层次时尤其如此。
注:看起来的SQL Server 2019将引入某种形式的标量函数内联为好。
在SQL Server中,函数和存储过程是两种不同类型的实体。
功能:在SQL Server数据库中,该功能用于执行一些动作和动作立即返回一个结果。 功能有两种类型:
系统定义
用户自定义
存储过程:在SQL Server中,存储过程都存储在服务器,它可以返回零,单个和多个值。 存储过程有两种类型: