在SQL Server 2008中创建参数化VIEW

Sre*_*r P 70 sql sql-server

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

或者其他任何替代方案?

Ada*_*Dev 120

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

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)
Run Code Online (Sandbox Code Playgroud)

如果您查看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
Run Code Online (Sandbox Code Playgroud)

略有不同,但在查询中使用该函数时性能可能存在很大差异.

  • 避免什么的例子非常非常重要.我只做了一个更改,将我的功能与第一个例子相匹配(将其从"要避免的东西"移开),我获得了巨大的性能提升. (6认同)
  • 如果需要在链接服务器之间进行调用,则存在问题,不允许使用表值函数. (2认同)

Adr*_*der 11

你不能.但是您可以创建用户定义的表函数.


hex*_*mal 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)
Run Code Online (Sandbox Code Playgroud)

...在sql-query中:

set context_info 2
select * from view_test
Run Code Online (Sandbox Code Playgroud)

会是一样的

select * from table where id = 2
Run Code Online (Sandbox Code Playgroud)

但使用udf更容易接受

  • 我会认真的CRY,**很多很多哭啊,水桶满满的.不眠之夜...... (17认同)
  • 没有不尊重,但这是你可以做什么和你应该(或不应该)做什么之间的差异的一个很好的例子. (17认同)
  • 我不坚持这个解决方案.我自己从未在mssql中使用它.我刚刚提到理论上它是可能的 (6认同)