83

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

4

8 回答 8

74

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

归功于jkrajes

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

于 2013-01-23T04:35:29.207 回答
40

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

  1. 用于sp_rename重命名表类型,我通常只是将 z 添加到名称的开头。
  2. 使用原始名称和您需要对表类型进行的任何修改创建一个新表类型。
  3. 逐步检查每个依赖项并sp_refreshsqlmodule在其上运行。
  4. 删除重命名的表类型。

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

警告:

这可能会破坏您的数据库,因此您需要先在开发环境中进行测试。

于 2015-05-22T18:04:34.190 回答
15

这里有一些简单的步骤,可以最大限度地减少乏味,并且不需要容易出错的半自动化脚本或昂贵的工具。

请记住,您可以从“对象资源管理器详细信息”窗口为多个对象生成 DROP/CREATE 语句(以这种方式生成时,DROP 和 CREATE 脚本被分组,这使得在 Drop 和 Create 操作之间插入逻辑变得容易):

拖放并创建到

  1. 备份您的数据库以防万一!
  2. 为所有依赖项自动生成 DROP/CREATE 语句(或为所有“可编程性”对象生成以消除查找依赖项的乏味)。
  3. 在 DROP 和 CREATE [dependencies] 语句之间(在所有 DROP 之后,在所有 CREATE 之前),插入生成的 DROP/CREATE [table type] 语句,使用 CREATE TYPE 进行所需的更改。
  4. 运行脚本,该脚本会删除所有依赖项/UDTT,然后重新创建 [UDTTs with alters]/dependencies。

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

于 2016-10-19T22:20:07.583 回答
9

Simon Zeinstra 找到了解决方案!

但是,我使用了 Visual Studio 社区 2015,我什至不必使用架构比较。

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

嘿普雷斯托!- 快速检查 SSMS 和 udtt 定义已被修改。

太棒了-谢谢西蒙。

于 2017-11-03T16:45:37.270 回答
9

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

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

于 2017-04-25T10:22:01.297 回答
4

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

于 2015-09-07T10:38:28.397 回答
3

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

于 2014-08-14T13:13:40.463 回答
2

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

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