CREATE FUNCTION [dbo].[GetProductDBCityCode](@PkgDBCityId int)
returns char(3)
as
BEGIN
DECLARE @str as char(3);
SELECT @str=MIN(C.CityCode) FROM City A
INNER JOIN Country B ON B.Country=A.Country
INNER JOIN Area_City C ON C.CnName=A.CityName
INNER JOIN Area_Country D ON D.CountryId=C.CountryId AND D.CnName=B.CountryName
WHERE A.City=@PkgDBCityId;
return @str
END
SELECT A.*, dbo.GetProductDBCityCode(A.startCity) AS startCityCode, dbo.GetProductDBCityCode(A.destCity) AS destCityCode, E.isFlight FROM pkgT3Segment A
INNER JOIN Pkg B ON A.Pkg=B.Pkg
LEFT JOIN pkgT3Choice E ON A.Pkg=E.Pkg AND A.segment=E.segment
Function相当于在foreach中执行,所以慢,可以考虑优为了一个中间存领View
===========================================
SELECT A.*, C.CityCode AS startCityCode, D.CityCode AS destCityCode, E.isFlight FROM pkgT3Segment A
INNER JOIN Pkg B ON A.Pkg=B.Pkg
LEFT JOIN VCityCode C ON A.startCity=C.CityId
LEFT JOIN VCityCode D ON A.destCity=D.CityId
LEFT JOIN pkgT3Choice E ON A.Pkg=E.Pkg AND A.segment=E.segment
view查询出来后,就相当于一个表,只计算一次
========================
http://www.cnblogs.com/clare-zhang/archive/2011/09/21/2183045.html
1 用户自定义函数的确给我们带来了很多方便。使代码更简洁和易读。
2 自定义函数用户视图,使 View 的书写更简单。
3 但是,如果用户自定义函数是通过检索表而得到返回值的情况时,千万就不要使用到视图中了。
原因:对视图进行查询的时候,SQLServer 的机制是,每查询到一行数据,都重新执行这个用户自定义函数,即要去多某表进行检索而得出结果。
如果视图的主题表有 1000 行,而函数里面检索的表有 1000 行,那么函数总共要执行 1000 * 1000 次检索任务。特别是检索的字段没有建立索引时,将会是“崩溃”性的结果。
V_UserDetails:
select F_GetUserName(ID), * from T_Users
F_GetUserName(@ID int)
{
declare @Name varchar(50)
select @Name = [Name] from T_OldUsers where [ID] = @ID
return @Name
}
以上函数和视图,在有 100000 条记录时,将执行 100000 * 100000 次检索。
4 解决以上(3) 的办法是:先将 Name 字段通过级联查询出中间表,再将中间表与视图的主题标进行级联。
5 如果用户自定义函数中没有使用检索表,而只是计算:
F_GetResult(@a int, @b int)
{
return @a * @b;
}
那么就另当别论了。随意使用
其它相关做法:
http://www.cnblogs.com/clare-zhang/archive/2011/09/21/2183045.html