我正在尝试使用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命令变量指定架构?
答案 0 :(得分:1)
在这种情况下,应使用动态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