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