【问题标题】:Visual Studio Database Project - Use SqlCmd Variable as Schema NameVisual Studio 数据库项目 - 使用 SqlCmd 变量作为架构名称
【发布时间】:2019-10-01 18:45:50
【问题描述】:

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

【问题讨论】:

  • 可以,但您必须使用动态 SQL;你不能参数化一个模式。这对我来说听起来像是一个 XY 问题。

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


【解决方案1】:

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

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

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

Visual Studio 足够聪明,可以将架构创建放在存储过程创建之前。还有第二种选择。您可以在“dbo”模式中创建存储过程。然后在 PostDeployment 脚本中,您可以将存储过程转移到“正确”模式。可以使用 SQLCMD 变量替换架构名称。

所以,基本上在 PostDeployment 脚本中,您可以像这样放置语句

ALTER SCHEMA myShema TRANSFER dbo.myStoredProcedure;

在此之前,您应该执行动态 T-SQL,如下面的 sn-p 所示。

: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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 2018-05-04
    相关资源
    最近更新 更多