我们可以在SQL Server 2008中创建参数化的VIEW。
或其他任何替代方案?
答案 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)
答案 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。