Можно ли динамически вызывать хранимую процедуру из представления?


В частности, можно ли вызвать proc из текущей базы данных в представлении. Я уже знаю о взломе openrowset, поэтому это работает, например:

create view MyView as
    select *
    from openrowset (
        'sqloledb',
        'server=(local);trusted_connection=yes;',
        'exec MyDatabase.dbo.MyStoredProcedure' -- Works fine
    )

Но я хотел бы иметь возможность вызывать proc из текущей БД без жесткого кодирования имени следующим образом:

create view MyView as
    select *
    from openrowset (
        'sqloledb',
        'server=(local);trusted_connection=yes;',
        'exec ' + db_name() + '.dbo.MyStoredProcedure' -- Don't want to hard-code DB name
    )
К сожалению, это не работает, так как openrowset ожидает литеральные строки, а не переменные любого рода.

Независимо от соображений безопасности и производительности, существует ли обходной путь? Это сделало бы обслуживание устаревшей системы намного более терпимым, поскольку proc, который вызовет это представление, подключается к другой базе данных в зависимости от среды (dev, test, prod).

1 3

1 ответ:

Нет, вы не можете использовать динамический SQL в представлении. Вы можете просто создать три представления, если есть только три различных "среды", и / или использовать синонимы в зависимости от среды. Например, у вас может быть три вида (псевдо/обрезанные):

create view dbo.devMyView as
    select * ... 'exec Dev.dbo.MyStoredProcedure'
go
create view dbo.testMyView as
    select * ... 'exec Test.dbo.MyStoredProcedure'
go
create view dbo.prodMyView as
    select * ... 'exec Prod.dbo.MyStoredProcedure'

Затем вы можете использовать динамический SQL в своем коде, чтобы указать, какое представление вы хотите, или вы можете удалить и создать синоним, когда вы хотите смоделировать каждую среду, например

DROP SYNONYM dbo.MyView;
GO
CREATE SYNONYM dbo.MyView FOR dbo.devMyView;

Теперь код, который ссылается на dbo.Мой взгляд будет в конечном счете вызовите хранимую процедуру в базе данных dev. Недостатком этого является то, что только один синоним может быть активным/перенаправляющим в любой момент времени.