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

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

据我所知,不可能改变/修改一个表types。你可以创build一个不同名字的types,然后删除旧types并修改为新名称

积分给jkrajes

按照msdn ,它就像'用户定义的表格types定义在创build后不能修改'。

这是一种黑客,但似乎工作。 以下是修改表types的步骤和示例。 需要注意的是,如果对表types所做的更改是对该对象(通常是过程)的重大更改,sp_refreshsqlmodule将会失败。

  1. 使用sp_rename来重命名表types,我通常只是将z添加到名称的开头。
  2. 使用原始名称创build一个新的表types,并对表types进行任何修改。
  3. 遍历每个依赖关系,并在sp_refreshsqlmodule上运行sp_refreshsqlmodule
  4. 删除重命名的表types。

 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 

警告:

这对你的数据库可能是破坏性的,所以你首先要在开发环境中进行testing。

这里是简单的步骤,最大限度地减less乏味,并不需要容易出错的半自动脚本或昂贵的工具。

请记住,您可以从“对象浏览器详细信息”窗口中为多个对象生成DROP / CREATE语句(如果以此方式生成DROP和CREATE脚本,则可以轻松地在Drop和Create操作之间插入逻辑): 在这里输入图像说明

  1. 备份你的数据库,以防万一发生错误!
  2. 自动为所有依赖关系生成DROP / CREATE语句(或为所有“Programmability”对象生成以消除查找依赖关系的繁琐操作)。
  3. 在DROP和CREATE [dependencies]语句(毕竟DROP,在所有CREATE之前)之间插入生成的DROP / CREATE [table type]语句,使用CREATE TYPE进行所需的更改。
  4. 运行脚本,该脚本将删除所有依赖项/ UDTT,然后重新创build[UDTT with alterations] / dependencies。

如果您的小型项目更改基础架构体系结构可能有意义,请考虑消除用户定义的表types。 entity framework和类似的工具允许您将大部分(如果不是全部的话)数据逻辑移动到易于维护的代码库中。

你不能修改/修改你的types。 您必须删除现有的并用正确的名称/数据types重新创build它,或添加一个新的列

您应该放弃旧的表格types并创build一个新的表格types。 但是,如果它有任何依赖关系(任何使用它的存储过程),您将无法删除它。 我已经发布了另一个关于如何自动执行临时删除所有存储过程,修改表格,然后恢复存储过程的答案 。

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

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

Simon Zeinstrafind了解决scheme!

但是,我使用Visual Studio社区2015年,我甚至没有使用架构比较。

使用SQL Server对象资源pipe理器,我在数据库中find了我的用户定义的表types。 我右键单击表格types并选中。 这在IDE中打开了一个代码标签,TSQL代码可见并可编辑 。 我只是改变了定义(在我的例子中只是增加了一个nvarchar字段的大小),然后单击选项卡左上angular的更新数据库button。

嘿Presto! – 在SSMS快速检查和udtt定义已被修改。

辉煌 – 感谢西蒙。