Sql server 在SQL Server中更改用户定义的表类型
如何在SQL Server中更改用户定义的表类型 据我所知,无法更改/修改表格类型。您 可以使用其他名称创建类型,然后删除旧类型 并将其修改为新名称 归功于Sql server 在SQL Server中更改用户定义的表类型,sql-server,user-defined-types,Sql Server,User Defined Types,如何在SQL Server中更改用户定义的表类型 据我所知,无法更改/修改表格类型。您 可以使用其他名称创建类型,然后删除旧类型 并将其修改为新名称 归功于 根据,这类似于“用户定义的表类型定义在创建后无法修改”。您不能更改/修改您的类型。您必须删除现有列并使用正确的名称/数据类型重新创建它,或者添加一个新列。这是一种黑客行为,但似乎确实有效。下面是修改表类型的步骤和示例。需要注意的是,如果对表类型所做的更改是对该对象(通常是一个过程)的破坏性更改,则sp_refreshsqlmodule将失败
根据,这类似于“用户定义的表类型定义在创建后无法修改”。您不能更改/修改您的类型。您必须删除现有列并使用正确的名称/数据类型重新创建它,或者添加一个新列。这是一种黑客行为,但似乎确实有效。下面是修改表类型的步骤和示例。需要注意的是,如果对表类型所做的更改是对该对象(通常是一个过程)的破坏性更改,则sp_refreshsqlmodule将失败
sp_rename
重命名表类型,我通常只需将z添加到
名字的开头sp\u refreshsqlmodule
警告:
这可能会破坏您的数据库,因此您需要首先在开发环境中进行测试。您应该删除旧表类型并创建一个新表。但是,如果它有任何依赖项(任何使用它的存储过程),您将无法删除它。我已经介绍了如何自动执行临时删除所有存储过程、修改表、然后恢复存储过程的过程。这里有一些简单的步骤,可以最大限度地减少繁琐,并且不需要容易出错的半自动脚本或昂贵的工具 请记住,您可以从“对象资源管理器详细信息”窗口为多个对象生成DROP/CREATE语句(以这种方式生成时,DROP和CREATE脚本被分组,这使得在DROP和CREATE操作之间插入逻辑变得容易):
如果您有较小的项目,改变基础架构可能是有意义的,请考虑消除用户定义的表类型。实体框架和类似工具允许您将大部分(如果不是全部)数据逻辑移动到易于维护的代码库中。
如果您可以在Visual Studio中使用数据库项目,则可以在项目中进行更改,并使用模式比较来同步对数据库的更改这样,删除和重新创建依赖对象由更改脚本处理。Simon Zeinstra找到了解决方案 但是,我使用了Visual Studio community 2015,甚至不必使用模式比较 使用SQLServer对象资源管理器,我在数据库中找到了用户定义的表类型。我用鼠标右键单击表格类型并选择。这在IDE中打开了一个代码选项卡,TSQL代码可见且可编辑。我只是更改了定义(在我的例子中只是增加了nvarchar字段的大小),然后单击了选项卡左上角的updatedatabase按钮 嘿,普雷斯托已修改SSMS和udtt定义中的快速检查
非常感谢Simon。在我的一个项目中,我不得不改变用户定义的表类型。以下是我采用的步骤:
根据用户定义的类型和用户定义的类型本身,我使用一系列生成的所有对象的拖放/创建脚本。如何在sql中使用20000多行脚本?删除/创建需要更改的表类型的所有依赖项:p这太糟糕了(微软),现在每当我对这些表进行更改时,我都必须修改所有sp,然后删除、重新创建、返回并更新对它们的任何引用。考虑不周。。我知道这是一个咆哮,但他们在想什么呢?而且似乎你甚至不允许更改用户定义表类型的所有者。删除表类型并使用新的所有者名称再次创建它似乎是在需要修改时更改所有者名称的唯一方法。sp_changeobjectowner不处理用户定义的表类型…在MSDN链接上对sp_refreshsqlmodule的评论:非常危险。但是这个SP是否也会更新引用对象的文本,或者只是更新编译后的表单。我的意思是,如果我在一个引用的SP上运行SP_HELPTEXT,那么我是否会在那里获得新的类型名称?这不会将存储过程中的表类型更改为z表类型。它所做的一切都是按原样刷新模式,但修复对表类型的引用。如果在重新创建表类型后未在存储过程上运行sp_refreshsqlmodle,则存储过程将失败,表明表类型已更改。我确实建议在生产环境中运行之前在YouDB的开发版本上运行它。这个答案对我不适用。
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