在 SqlUserDefinedTypeAttribute 中设置架构名称

Set schema name in SqlUserDefinedTypeAttribute

为了 SQLCLR 集成而在 C# 代码中创建 UserDefinedType 时,需要在 class 或结构前加上 SqlUserDefinedType,例如此处:

[SqlUserDefinedType(
    Name = "g.Options",
    // ...
)]
public struct Options : INullable {
    // ...
}

请注意,在 "Name" 参数中,除了对象名称之外,我还尝试设置架构。但是,当我在 Visual Studio 数据库项目的发布阶段生成脚本时,我得到:

CREATE TYPE [dbo].[g.Options]

SqlUserDefinedType 没有 "schema" 参数。

我确实相信我可以编写 T-SQL 脚本来专门从程序集中生成类型,但我想避免这种情况,因为我计划将我的大部分类型放在不同的模式中并且必须通过显式 TSQL 对每个人进行注册是不高兴的。


编辑:

正如 Solomon Rutzky 指出的那样,您可以在项目属性中设置默认架构。它当然不能替代类似于 SqlUserDefinedType 中的 'schema' 参数的东西,特别是如果您想使用多个模式,但它确实可以满足许多人的需求。

post-部署脚本在技术上可以完成工作,但不幸的是,比较引擎不知道 post-部署逻辑,因此将永久注册模式差异为需要改变的东西。因此,无论您是否更改它们,所有受影响的对象都将在每次发布时被删除并重新创建。

模式名称在每个项目的单个位置指定,而不是每个对象。

您可以通过以下方式在 Visual Studio 中设置它:

"Project"(菜单)->“{project_name} 属性...”(菜单选项)->"Project Settings"(选项卡)

在右侧的 "General" 部分中,有一个 "Default schema:"

的文本字段

或:

您可以手动编辑 {project_name}.sqlproj 文件,并在顶部 <PropertyGroup> 元素之一(没有"Condition" 属性;通常使用第一个这样的元素),您可以创建(或更新,如果它已经存在)以下元素:

<DefaultSchema>dbo</DefaultSchema>

但是,如果您想要将一个对象(例如 UDT)设置为与其余对象使用的不同的架构名称,则必须在 Post 版本中手动完成SQL 脚本。您可以将 SQL 脚本添加到您的项目,然后在右侧的解决方案资源管理器中,select SQL 脚本,转到其属性,对于 "BuildAction", select“Post部署”。在该 post-部署脚本中,发出 ALTER SCHEMA 语句:

ALTER SCHEMA [g] TRANSFER TYPE::dbo.Options;