Ada*_*Dev 120
尝试创建内联表值函数.例:
CREATE FUNCTION dbo.fxnExample (@Parameter1 INTEGER)
RETURNS TABLE
AS
RETURN
(
SELECT Field1, Field2
FROM SomeTable
WHERE Field3 = @Parameter1
)
-- Then call like this, just as if it's a table/view just with a parameter
SELECT * FROM dbo.fxnExample(1)
Run Code Online (Sandbox Code Playgroud)
如果您查看SELECT的执行计划,您根本不会看到该函数的提及,实际上只会向您显示正在查询的基础表.这很好,因为这意味着在为查询生成执行计划时将使用基础表的统计信息.
要避免的是多语句表值函数,因为不会使用基础表统计信息,并且由于执行计划不佳而导致性能低下.
要避免的例子:
CREATE FUNCTION dbo.fxnExample (@Parameter1 INTEGER)
RETURNS @Results TABLE(Field1 VARCHAR(10), Field2 VARCHAR(10))
AS
BEGIN
INSERT @Results
SELECT Field1, Field2
FROM SomeTable
WHERE Field3 = @Parameter1
RETURN
END
Run Code Online (Sandbox Code Playgroud)
略有不同,但在查询中使用该函数时性能可能存在很大差异.
实际上存在一个诀窍:
create view view_test as
select
*
from
table
where id = (select convert(int, convert(binary(4), context_info)) from master.dbo.sysprocesses
where
spid = @@spid)
Run Code Online (Sandbox Code Playgroud)
...在sql-query中:
set context_info 2
select * from view_test
Run Code Online (Sandbox Code Playgroud)
会是一样的
select * from table where id = 2
Run Code Online (Sandbox Code Playgroud)
但使用udf更容易接受