Проект базы данных Visual Studio - используйте переменную SqlCmd в качестве имени схемы - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь создать хранимые процедуры с разными схемами, используя переменные команды SQL, однако я не могу построить проект из-за ошибки:

SQL71501: Procedure: [$(SchemaName)].[pr_MySproc] has an unresolved reference to Schema [$(SchemaName)].

Вот так у менязаписанная хранимая процедура:

CREATE PROCEDURE [$(SchemaName)].[pr_MySproc]
    @Param1 tinyint = 0,
    @Param2 INT = 0
...

А затем серия профилей публикации, содержащих переменные, подобные этой:

<SqlCmdVariable Include="SchemaName">
  <Value>SCHEMA1</Value>
</SqlCmdVariable>

Возможно ли то, что я пытаюсь сделать, даже возможно?Есть ли способ указать схему с помощью командных переменных SQL?

1 Ответ

1 голос
/ 14 мая 2019

В вашем случае вы должны использовать динамический T-SQL. Тем не менее, вы должны рассмотреть некоторые дополнительные параметры.

Во-первых, если вы действительно знаете имя своей схемы, то совершенно безопасно создать схему, а затем хранимую процедуру. В контекстном меню проекта выберите «Добавить новый элемент», а затем в разделе «Безопасность» выберите «Shema», как показано на рисунке ниже.

enter image description here

После этого вы можете добавить хранимую процедуру, добавив префикс к вновь созданной схеме, см. Изображение ниже.

enter image description here

Visual Studio достаточно умен, чтобы поставить создание схемы перед созданием хранимой процедуры. Есть и второй вариант. Вы можете создать свою хранимую процедуру в схеме 'dbo'. Затем в сценарии PostDeployment вы можете перенести хранимую процедуру в «правильную» схему. Имя схемы можно заменить с помощью переменной SQLCMD.

Таким образом, в основном в сценарии PostDeployment вы помещаете оператор следующим образом

ALTER SCHEMA myShema TRANSFER dbo.myStoredProcedure;

Перед этим вы должны выполнить динамический T-SQL, как показано в следующем фрагменте.

:setvar ShemaName "MyShema"


IF NOT EXISTS (
    SELECT schema_name
    FROM information_schema.schemata
    WHERE schema_name = '$(ShemaName)')

BEGIN
    EXEC sp_executesql N'CREATE SCHEMA $(ShemaName)'
END
...