代码之家  ›  专栏  ›  技术社区  ›  Vivian River

如何使用新名称创建与现有表相同的SQL用户定义表类型?

  •  0
  • Vivian River  · 技术社区  · 5 年前

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

    例如,如果我在一个现有的SQL数据库上运行这个理论工具,该数据库包含三个名为 MyUdt , YourUdt 和 ABCUdt ,结果是数据库现在将包含四个UDT: MyUdt公司 , YourUdt公司 , ABCUdt公司 和 ABCUdt-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 "?

    0 回复  |  直到 5 年前
        1
  •  1
  •   AlwaysLearning    5 年前

    与用户定义表一样,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;
    
    名称 system\u type\u id user\u type\u id schema\u id principal\u id 最大\u长度 精确 规模 排序规则\u名称 is\u可为Null 是否定义了\u user\u is\U assembly\U类型 默认\u object\u id rule\u object\u id is\U table\U类型 type\u table\u object\u id \u memory\u是否已优化
    ABCTest测试 243 257 1. 无效的 -1 0 0 无效的 0 1. 0 0 0 1. 1778105375 0
    对象\u id 名称 列\u id system\u type\u id user\u type\u id 最大\u长度 精确 规模 排序规则\u名称 is\u可为Null 是否有ansi\U填充 is\U rowguidcol is\U标识 is\U计算 is\U文件流 是否复制了\u 是否订阅了\u non\u sql\u \u merge\u是否已发布 是否复制了\u dts\u is\u xml\u文档 xml\u集合\u id 默认\u object\u id rule\u object\u id is\u稀疏 is\U column\U集合 生成的\u always\u类型 生成的\u always\u type\u desc encryption\u类型 加密\u type\u desc encryption\u algorithm\u名称 column\u encryption\u key\u id column\u encryption\u key\u database\u name列 是否隐藏\u 是否被屏蔽 graph\u类型 graph\u type\u描述
    1778105375 测试ID 1. 56 56 4. 10 0 无效的 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 不适用 无效的 无效的 无效的 无效的 无效的 0 0 无效的 无效的
    1778105375 测试名称 2. 231 231 100 0 0 拉丁文1\u General\u 100\u CI\u AS 1. 1. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 不适用 无效的 无效的 无效的 无效的 无效的 0 0 无效的 无效的

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