Visual Studio数据库项目-使用SqlCmd变量作为架构名称

时间:2019-05-14 17:18:14

标签: sql sql-server visual-studio tsql sqlcommand

我正在尝试使用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 个答案:

答案 0 :(得分:1)

在这种情况下,应使用动态T-SQL。但是,您应该考虑一些其他选项。

首先,如果您真的知道架构名称,那么先创建架构然后再创建存储过程是完全安全的。 从项目上下文菜单中,选择“添加新项”,然后在“安全性”节点下选择“ Shema”,如下图所示。

enter image description here

之后,您可以通过以新创建的shema为前缀添加存储过程,请参见下图。

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