如何在SQL Server中更改用户定义的表类型?
Answers:
这是一种破解,但似乎确实可行。以下是修改表类型的步骤和示例。请注意,如果您对表类型所做的更改是对该对象(通常是过程)的重大更改,则sp_refreshsqlmodule将失败。
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
在用户定义的datat类型上抛出一个错误: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操作之间插入逻辑变得容易):
如果您的小型项目可能需要更改基础架构,则请考虑消除用户定义的表类型。实体框架和类似的工具使您能够将大部分(如果不是全部)数据逻辑移至易于维护的代码库中。
如果可以在Visual Studio中使用数据库项目,则可以在项目中进行更改,并使用架构比较将更改同步到数据库。
这样,更改脚本将处理删除并重新创建相关对象的过程。
Simon Zeinstra找到了解决方案!
但是,我使用了Visual Studio community 2015,甚至没有使用架构比较。
使用SQL Server Object Explorer,我在数据库中找到了用户定义的表类型。我右键单击表格类型,然后选择。这在IDE中打开了一个代码选项卡,其中TSQL代码可见且可编辑。我只是简单地更改了定义(在我的情况下,只是增加了nvarchar字段的大小),然后单击“更新数据库”了选项卡左上角的“按钮。
嗨,普雷斯托!-快速检查SSMS并修改了udtt定义。
辉煌-感谢Simon。