Создание параметризованного VIEW в SQL Server 2008

Можно ли создать параметризованный VIEW в SQL Server 2008.

Или любая другая альтернатива для этого?

Ответ 1

Попробуйте создать встроенную функцию, ориентированную на таблицу. Пример:

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

Тонкая разница, но с потенциально большими различиями в производительности, когда функция используется в запросе.

Ответ 3

на самом деле существует один трюк:

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-запросе:

set context_info 2
select * from view_test

будет одинаковым с

select * from table where id = 2

но использование udf более приемлемо

Ответ 4

Как отметил специалист, вы можете сделать это с помощью UDF. Однако для больших наборов с использованием скалярной функции (как опровергается встроенной функцией таблицы) производительность будет вонять, поскольку функция оценивается по строкам. В качестве альтернативы вы можете опубликовать те же результаты с помощью хранимой процедуры, выполняющей фиксированный запрос с заполнителями, который заменяет ваши значения параметров.

(Ниже приведена несколько устаревшая, но все же соответствующая статья по обработке строк за строкой для скалярных UDF.)

Изменить: комментарии re. снижая производительность, с тем чтобы дать понять, что это относится к скалярным UDF.

Ответ 5

нет. Вы можете использовать UDF, в котором вы можете передавать параметры.