繁体   English   中英

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

[英]Visual Studio Database Project - Use SqlCmd Variable as Schema Name

我正在尝试使用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命令变量指定架构?

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

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

在此处输入图片说明

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

在此处输入图片说明

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM