在SQL Server中更改用户定义的表类型

时间:2012-07-10 09:52:24

标签: sql-server user-defined-types

如何在SQL Server中更改用户定义的表类型?

8 个答案:

答案 0 :(得分:61)

  

据我所知,不可能改变/修改表格类型。你   可以创建具有不同名称的类型,然后删除旧类型   并将其修改为新名称

jkrajes

的信用

根据msdn,它就像'用户定义的表类型定义在创建后无法修改'。

答案 1 :(得分:33)

这是一种黑客攻击,但似乎确实有效。以下是修改表类型的步骤和示例。需要注意的是,如果对表类型所做的更改是对该对象的重大更改(通常是过程),则sp_refreshsqlmodule将失败。

  1. 使用sp_rename重命名表格类型,我通常只需添加z 这个名字的开头。
  2. 使用原始名称和任何修改创建新表类型 你需要制作表格类型。
  3. 逐步执行每个依赖项并在其上运行sp_refreshsqlmodule
  4. 删除重命名的表格类型。
  5. EXEC sys.sp_rename 'dbo.MyTableType', 'zMyTableType';
    GO
    CREATE TYPE dbo.MyTableType AS TABLE(
        Id INT NOT NULL,
        Name VARCHAR(255) NOT NULL
    );
    GO
    DECLARE @Name NVARCHAR(776);
    
    DECLARE REF_CURSOR CURSOR FOR
    SELECT referencing_schema_name + '.' + referencing_entity_name
    FROM sys.dm_sql_referencing_entities('dbo.MyTableType', 'TYPE');
    
    OPEN REF_CURSOR;
    
    FETCH NEXT FROM REF_CURSOR INTO @Name;
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
        EXEC sys.sp_refreshsqlmodule @name = @Name;
        FETCH NEXT FROM REF_CURSOR INTO @Name;
    END;
    
    CLOSE REF_CURSOR;
    DEALLOCATE REF_CURSOR;
    GO
    DROP TYPE dbo.zMyTableType;
    GO
    

    警告:

    这可能对您的数据库具有破坏性,因此您首先要在开发环境中对此进行测试。

答案 2 :(得分:12)

以下是简化步骤的简单步骤,不需要容易出错的半自动脚本或昂贵的工具。

请记住,您可以从Object Explorer Details窗口为多个对象生成DROP / CREATE语句(以这种方式生成时,DROP和CREATE脚本被分组,这使得在Drop和Create操作之间插入逻辑变得容易): enter image description here

  1. 备份数据库以防万一出错!
  2. 自动为所有依赖项生成DROP / CREATE语句(或为所有“可编程性”对象生成,以消除查找依赖项的繁琐)。
  3. 在DROP和CREATE [dependencies]语句之间(在所有DROP之后,在所有CREATE之前),插入生成的DROP / CREATE [表类型]语句,使用CREATE TYPE进行所需的更改。
  4. 运行脚本,删除所有依赖项/ UDTT,然后重新创建[带有更改的UDTT] /依赖项。
  5. 如果您的项目较小,可能需要更改基础架构体系结构,请考虑删除用户定义的表类型。实体框架和类似工具允许您将大部分(如果不是全部)数据逻辑移动到更容易维护的代码库中。

答案 3 :(得分:5)

如果可以在Visual Studio中使用数据库项目,则可以在项目中进行更改并使用模式比较来同步对数据库的更改。

这样,删除和重新创建依赖对象由更改脚本处理。

答案 4 :(得分:3)

Simon Zeinstra找到了解决方案!

但是,我使用Visual Studio社区2015,我甚至不必使用模式比较。

使用SQL Server对象资源管理器,我在数据库中找到了用户定义的表类型。我右键单击表格类型并选中。这在IDE中打开了一个代码选项卡,其中TSQL代码可见且可编辑。我只是更改了定义(在我的例子中只增加了nvarchar字段的大小)并单击选项卡左上角的更新数据库按钮。

嘿Presto! - 快速检查SSMS并修改了udtt定义。

很棒 - 谢谢西蒙。

答案 5 :(得分:1)

你不能改变/修改你的TYPE。您必须删除现有的并使用正确的名称/数据类型重新创建它或添加新列

答案 6 :(得分:1)

您应该删除旧表类型并创建一个新表。但是,如果它有任何依赖项(使用它的任何存储过程),您将无法删除它。我posted another answer介绍了如何自动执行临时删除所有存储过程,修改表表然后恢复存储过程的过程。

答案 7 :(得分:1)

只需在我的一个项目中更改用户定义的表类型即可。以下是我采用的步骤:

  1. 使用用户定义的表类型查找所有 SP。
  2. 为找到的所有 SP 保存一个创建脚本。
  3. 删除 SP。
  4. 为要更改的用户定义表保存创建脚本。 4.5 向用户定义的表类型添加您需要的附加列或更改。
  5. 删除用户定义的表类型。
  6. 为用户定义的表类型运行创建脚本。
  7. 为 SP 运行创建脚本。
  8. 然后开始相应地修改 SP。