在SQL Server 2008中创建参数化VIEW

时间:2010-12-21 10:36:26

标签: sql sql-server

我们可以在SQL Server 2008中创建参数化的VIEW。

或其他任何替代方案?

5 个答案:

答案 0 :(得分:118)

尝试创建内联表值函数。例如:

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

完全不同,但在查询中使用该函数时性能可能存在很大差异。

答案 1 :(得分:11)

不,你不能。但您可以创建user defined table function

答案 2 :(得分:5)

实际上存在一个诀窍:

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更容易接受

答案 3 :(得分:2)

正如旁观者所说,你可以用UDF做到这一点。但是,对于使用标量函数的大型集合(对于内联表函数),性能会随着函数逐行评估而发臭。作为替代方案,您可以通过存储过程使用占位符执行固定查询来显示相同​​的结果,占位符将替换您的参数值。

Here's关于标量UDF的逐行处理的一篇有些过时但仍然相关的文章。)

编辑:评论重新。调整降级性能以明确这适用于标量UDF。

答案 4 :(得分:0)

没有。您可以使用可以传递参数的UDF。