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