【发布时间】:2012-07-10 09:52:23
【问题描述】:
如何在 SQL Server 中更改用户定义的表类型?
【问题讨论】:
标签: sql-server user-defined-types
如何在 SQL Server 中更改用户定义的表类型?
【问题讨论】:
标签: sql-server user-defined-types
【讨论】:
这是一种 hack,但似乎确实有效。以下是修改表类型的步骤和示例。需要注意的是,如果您对表类型所做的更改是对该对象(通常是过程)的重大更改,则 sp_refreshsql 模块将失败。
sp_rename重命名表类型,我一般只加z
名称的开头。sp_refreshsqlmodule。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
警告:
这可能会破坏您的数据库,因此您需要先在开发环境中对其进行测试。
【讨论】:
sp_refreshsqlmodle,则存储过程将失败,说明表类型已更改。我确实建议在生产中运行它之前在你的数据库的开发版本上运行它。
sp_rename 在用户定义的数据类型上给我一个错误:Either the parameter @objname is ambiguous or the claimed @objtype ((null)) is wrong. 有什么问题?
EXEC sys.sp_rename 'dbo.MyTableType', 'zMyTableType', 'OBJECT'; 这样传入对象类型。还要确保您包含第一个参数的架构,而不是第二个参数。
这里有一些简单的步骤,可以最大限度地减少乏味,并且不需要容易出错的半自动化脚本或昂贵的工具。
请记住,您可以从“对象资源管理器详细信息”窗口为多个对象生成 DROP/CREATE 语句(以这种方式生成时,将 DROP 和 CREATE 脚本分组,这样可以轻松地在 Drop 和 Create 操作之间插入逻辑):
如果您有较小的项目可能需要更改基础架构架构,请考虑消除用户定义的表类型。 Entity Framework 和类似工具允许您将大部分(如果不是全部)数据逻辑移动到更易于维护的代码库中。
要为多个对象生成 DROP/CREATE 语句,您可以右键单击数据库 > 任务 > 生成脚本...(如下面的屏幕截图所示)。注意:
DROP 语句是之前 CREATE 语句DROP 语句按依赖顺序(即 CREATE 的逆向)CREATE 语句按依赖顺序
【讨论】:
如果您可以在 Visual Studio 中使用数据库项目,则可以在项目中进行更改并使用架构比较将更改同步到数据库。
这样,删除和重新创建依赖对象由更改脚本处理。
【讨论】:
Simon Zeinstra 找到了解决方案!
但是,我使用了 Visual Studio 社区 2015,我什至不必使用架构比较。
使用 SQL Server 对象资源管理器,我在数据库中找到了我的用户定义表类型。我用鼠标右键单击表格类型并选择了 .这会在 IDE 中打开一个代码选项卡,其中 TSQL 代码可见且可编辑。我只是更改了定义(在我的例子中只是增加了 nvarchar 字段的大小)并单击了选项卡左上角的 Update Database 按钮。
嘿Presto! - 快速检查 SSMS 并修改了 udtt 定义。
太棒了 - 谢谢西蒙。
【讨论】:
您应该删除旧表类型并创建一个新表类型。但是,如果它有任何依赖项(任何使用它的存储过程),您将无法删除它。我已经posted another answer 介绍了如何自动化临时删除所有存储过程、修改表表然后恢复存储过程的过程。
【讨论】:
你不能改变/修改你的类型。您必须删除现有的并使用正确的名称/数据类型重新创建它或添加新列/s
【讨论】:
只需在我的一个项目中更改用户定义的表类型即可。以下是我采用的步骤:
【讨论】: