我们可以在SQL Server 2008中创建参数化的VIEW吗?
或对此有其他选择吗?
我们可以在SQL Server 2008中创建参数化的VIEW吗?
或对此有其他选择吗?
Answers:
尝试创建一个内联表值函数。例:
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)
如果您查看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
稍有不同,但在查询中使用该函数时,性能可能存在很大差异。
实际上,存在一个技巧:
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)
...在sql-query中:
set context_info 2
select * from view_test
将与相同
select * from table where id = 2
但使用udf更可取
正如旁观者所提到的,您可以使用UDF做到这一点。但是,对于使用标量函数的大型集合(与内联表函数相对应),由于逐行评估该函数,因此性能会很差。或者,您可以通过存储过程执行相同的结果,该存储过程使用占位符替换参数值来执行固定查询。
(这是有关标量UDF的逐行处理的过时但仍然有意义的文章。)
编辑:评论重新。调整了可降低的性能,以使其清楚地适用于标量UDF。