假设我必须实现一段必须返回表的T-SQL代码.我可以实现一个表值函数或一个返回一组行的存储过程.我该怎么用?
简而言之,我想知道的是:
哪些是函数和存储过程之间的主要区别?使用其中一个时需要考虑哪些因素?
我有一个案例,我需要翻译(查找)同一个表中的几个值.我编写它的第一种方法是使用子查询:
SELECT
(SELECT id FROM user WHERE user_pk = created_by) AS creator,
(SELECT id FROM user WHERE user_pk = updated_by) AS updater,
(SELECT id FROM user WHERE user_pk = owned_by) AS owner,
[name]
FROM asset
Run Code Online (Sandbox Code Playgroud)
因为我使用这个子查询很多(也就是说,我有大约50个带有这些字段的表),我可能需要在子查询中添加更多代码(例如,"AND active = 1")我想我d将这些放入用户定义的函数UDF并使用它.但使用该UDF的性能非常糟糕.
CREATE FUNCTION dbo.get_user ( @user_pk INT )
RETURNS INT
AS BEGIN
RETURN ( SELECT id
FROM ice.dbo.[user]
WHERE user_pk = @user_pk )
END
SELECT dbo.get_user(created_by) as creator, [name]
FROM asset
Run Code Online (Sandbox Code Playgroud)
#1的性能不到1秒.#2的表现大约是30秒......
为什么,或者更重要的是,我有什么方法可以在SQL Server 2008中编码,这样我就不必使用这么多子查询了?
只是对这个有用时的更多解释.当我想为用户提供文本时,这个简单的查询(即获取用户ID)会变得更加复杂,因为我必须加入配置文件来获取语言,并与公司一起查看该语言是否应该被提取'而是从那里编辑,并与翻译表,以获得翻译的文本.对于大多数这些查询,性能是可读性和可维护性的次要问题.
sql sql-server performance user-defined-functions sql-server-2008
在SQLSERVER 2005中,我使用表值函数作为从大表(传递日期范围或此类参数)对子集数据执行任意聚合的便捷方式.
我在大型查询中使用这些作为联合计算,我想知道查询计划优化器是否在每种情况下都能很好地与它们配合使用,或者我是否更好地在我的大型查询中取消这样的计算.
代码示例:
create table dbo.customers (
[key] uniqueidentifier
, constraint pk_dbo_customers
primary key ([key])
)
go
/* assume large amount of data */
create table dbo.point_of_sales (
[key] uniqueidentifier
, customer_key uniqueidentifier
, constraint pk_dbo_point_of_sales
primary key ([key])
)
go
create table dbo.product_ranges (
[key] uniqueidentifier
, constraint pk_dbo_product_ranges
primary key ([key])
)
go
create table dbo.products (
[key] uniqueidentifier
, product_range_key uniqueidentifier
, release_date datetime
, constraint pk_dbo_products
primary key ([key])
, constraint fk_dbo_products_product_range_key …Run Code Online (Sandbox Code Playgroud) t-sql sql-server sql-server-2005 query-optimization user-defined-functions