在SQL Server 2008中创build参数化的VIEW

我们可以在SQL Server 2008中创build参数化的VIEW吗?

或者任何其他的替代scheme呢?

尝试创build一个内联表值函数。 例:

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 

细微的不同,但是在查询中使用函数时性能可能会有很大的差异。

你不能。 但是你可以创build一个用户自定义的表格function 。

正如前面提到的那样,你可以用UDF做到这一点。 但是,对于使用标量函数的大集合(与内联表函数相反),由于函数是逐行计算的,因此性能会很差。 作为替代方法,您可以通过执行固定查询的存储过程公开使用占位符replace参数值的相同结果。

( 这是一个有点过时但是仍然相关的文章,关于标量UDF的逐行处理。

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

其实存在一个窍门:

 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。