【问题标题】:How to create a SQL User-Defined Table Type identical to an existing one with a new name?如何使用新名称创建与现有表类型相同的 SQL 用户定义表类型?
【发布时间】:2021-01-29 22:25:56
【问题描述】:

我正在尝试创建一个工具,该工具将在 MS SQL Server 上的数据库中查找以 ABC 开头的用户定义表类型,然后创建一组相同但使用 @ 的新用户定义表类型987654325@ 附加在名称的末尾。

因此,例如,如果我在现有 SQL 数据库上运行此理论工具,该数据库包含三个 UDT,名为 MyUdtYourUdtABCUdt,结果将是数据库现在包含四个 UDT: MyUdtYourUdtABCUdtABCUdt-X

这似乎与关于如何创建与表匹配的 UDT 的问题非常相似:Automatically generate a user defined table type that matches an existing table

我知道 SQL 数据库包含其每个存储过程的定义为文本,这可以在 sys 表上查询,但看起来 UDT 没有这样的定义存储。

在我麻烦地编写将现有 UDT 分解为语句以创建新 UDT 的代码之前,谁能告诉我是否有办法编写一个命令,“嘿,MS SQL Server,采取UDT ABCUdt 并创建另一个与它完全相同的名称 ABCUdt-X"?

【问题讨论】:

  • 您是否需要触发器以及未复制的内容,或者只是简单的结构、表及其列?有没有数据?
  • 我正在尝试创建一个工具 一个应用程序?使用什么语言? SMO 是支持该功能的类库。
  • 在 SSMS 和 VS 中,它能够一次编写一个 UDT 脚本。复制/粘贴没有?
  • @stickybit 我正在复制user defined table type不是表格。

标签: sql sql-server user-defined-types


【解决方案1】:

与用户定义表一样,SQL Server 将用户定义表类型及其列的定义存储在系统视图中,例如:

drop type if exists dbo.ABCTest;

create type dbo.ABCTest as table (
  TestID int not null,
  TestName nvarchar(50)
);

declare @type_table_object_id int = (
    select type_table_object_id
    from sys.table_types
    where [name] = N'ABCTest'
);
select * from sys.table_types where type_table_object_id = @type_table_object_id;

select * from sys.all_columns where object_id = @type_table_object_id;
name system_type_id user_type_id schema_id principal_id max_length precision scale collation_name is_nullable is_user_defined is_assembly_type default_object_id rule_object_id is_table_type type_table_object_id is_memory_optimized
ABCTest 243 257 1 NULL -1 0 0 NULL 0 1 0 0 0 1 1778105375 0
object_id name column_id system_type_id user_type_id max_length precision scale collation_name is_nullable is_ansi_padded is_rowguidcol is_identity is_computed is_filestream is_replicated is_non_sql_subscribed is_merge_published is_dts_replicated is_xml_document xml_collection_id default_object_id rule_object_id is_sparse is_column_set generated_always_type generated_always_type_desc encryption_type encryption_type_desc encryption_algorithm_name column_encryption_key_id column_encryption_key_database_name is_hidden is_masked graph_type graph_type_desc
1778105375 TestID 1 56 56 4 10 0 NULL 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 NOT_APPLICABLE NULL NULL NULL NULL NULL 0 0 NULL NULL
1778105375 TestName 2 231 231 100 0 0 Latin1_General_100_CI_AS 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 NOT_APPLICABLE NULL NULL NULL NULL NULL 0 0 NULL NULL

您可以根据此信息重新生成用户定义表类型的 SQL 定义,以使用不同的名称重新创建它,但正如 SMor 在 cmets 中所说,让 SMO 为您完成这项工作可能更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    相关资源
    最近更新 更多