Можно ли создать параметризованный VIEW в SQL Server 2008.
Или любая другая альтернатива для этого?
Можно ли создать параметризованный VIEW в SQL Server 2008.
Или любая другая альтернатива для этого?
Попробуйте создать встроенную функцию, ориентированную на таблицу. Пример:
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
Тонкая разница, но с потенциально большими различиями в производительности, когда функция используется в запросе.
Нет, вы не можете. Но вы можете создать пользовательскую функцию таблицы.
на самом деле существует один трюк:
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 более приемлемо
Как отметил специалист, вы можете сделать это с помощью UDF. Однако для больших наборов с использованием скалярной функции (как опровергается встроенной функцией таблицы) производительность будет вонять, поскольку функция оценивается по строкам. В качестве альтернативы вы можете опубликовать те же результаты с помощью хранимой процедуры, выполняющей фиксированный запрос с заполнителями, который заменяет ваши значения параметров.
Изменить: комментарии re. снижая производительность, с тем чтобы дать понять, что это относится к скалярным UDF.
нет. Вы можете использовать UDF, в котором вы можете передавать параметры.