在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。