前言

SQL Server开发过程中,为了传入数据集类型的变量(比如接受C#中的DataTable类型变量),需要定义“用户自定义表类型”,通过“用户自定义表类型”可以接收二维数据集作为参数,在需要修改“用户自定义表类型”的时候,增加字段,删除字段,修改字段类型等,它没有像表一样的alter table语法来进行修改。
只能通过删除重建来实现,但是在删除“用户自定义表类型”的时候会提示有对象引用它(某些存储过程用到了这个“用户自定义表类型”),因此无法删除。
为了达到公用的目的,有时候一个TableType可以在多个地方分别被引用到,这样的话,势必要先删除所有的引用了这个“用户自定义表类型”的对象(存储过程等)
如果这个“用户自定义表类型”被多个存储过程引用,那么就要分别删除多个引用了“用户自定义表类型”的存储过程,然后修改“用户自定义表类型”,在重建存储过程,这样做起来似乎有点绕,这个问题可以用过EXEC sys.sp_refreshsqlmodule这个系统函数来简介实现“用户自定义表类型”的定义
TableType的基本使用
如下创建一个用户自定义表类型
定义的TableType可以在用户自定义表类型中找到
创建两个存储过程,分别用到了上面定义的用户自定义表类型,模拟用户自定义表类型被引用的情况
此时的存储过程可以接收TableType参数并正常运行
TableType的修改
TableType类型不支持alter语法,也即无法直接修改TableType的定义
那么只能通过删除TableType的方法来重建这个TableType,当删除的时候,仍然报错,提示“因为它正由对象 '***' 引用。可能还有其他对象在引用此类型。”
此时只能删除引用了这个TableType的对象来解决,下面可以查到那些对象引用了某一个TableType,然后分别删除,重建TableType,再重建存储过程,有点绕弯子。
可以先将自定义的某个TableType重命名,重命名的过程中有一个警告,这里先忽略它,随后可以直接Drop Type dbo.MyTableType
删除原TableType之后,重建(重定义)TableType
重建TableType之后,先前存储过程中用到这个TableType的存储过程是无法编译通过的
此时就需要重新刷新引用对象的定义
刷新完成之后,原存储过程就可以正常编译了
最后删除原始的TableType被重命名的TableType(被第一步重名的那个)
这样子,整个过程就无需因为修改TableType的定义而删除引用了TableType的对象了,在修改了TableType的定义之后,引用了这个TableType的对象可以正常运行,也可以根据修改之后的TableType做具体的使用
完整的脚本如下
--判断Type是否存在,如果存在,重命名,随后之后才再删除,否则无法直接删除
IF EXISTS (SELECT 1 FROM sys.types t join sys.schemas s on t.schema_id=s.schema_id
and t.name='MyTableType' and s.name='dbo')
EXEC sys.sp_rename 'dbo.MyTableType', 'obsoleting_MyTableType';
GO
--重建TYPE,比如原来是四个字段,现在想修改为三个字段,或者原来有三个字段想加一个字段变成四个字段
CREATE TYPE dbo.MyTableType AS TABLE(
Id INT NOT NULL,
Name VARCHAR(255) NOT NULL, Remark VARCHAR(255)
)
GO
--将原来引用将要删除的TYPE全部重建一遍,否则原始存储过程会报错
DECLARE @Name NVARCHAR(500);
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
--最后删除原始的被重命名的TableType(被第一步重名的那个)
IF EXISTS (SELECT 1 FROM sys.types t
join sys.schemas s on t.schema_id=s.schema_id
and t.name='obsoleting_MyTableType' and s.name='dbo')
DROP TYPE dbo.obsoleting_MyTableType
GO
--最后执行授权
GRANT EXECUTE ON TYPE::dbo.MyTableType TO public
GO
总结:
TableType可以方便地接受二维数据作为参数,从而可以达到批量处理数据的目的,避免传递进去一大堆字符串,然后在对字符串解析的做法,从而可以在一定程度上提高sql的运行效率。
不过TableType的修改确实存在一定的问题,直接修改TableType会存在级联删除数据库对象的情况,可以通过“曲线救国”的方式,来减小工作量的情况下修改TableType。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# sql
# 用户自定义表类型
# sqlserver自定义类型
# sqlserver
# 自定义函数
# Sqlserver 表类型和表变量介绍
# 自定义
# 存储过程
# 重命名
# 多个
# 过程中
# 在一
# 报错
# 正常运行
# 好了
# 这个问题
# 一遍
# 可以通过
# 这样做
# 可以直接
# 不支持
# 因为它
# 用过
# 在对
# 时就
# 这篇文章
相关文章:
网站专业制作公司有哪些,做一个公司网站要多少钱?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
如何用低价快速搭建高质量网站?
如何确保西部建站助手FTP传输的安全性?
宝塔建站助手安装配置与建站模板使用全流程解析
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
如何选购建站域名与空间?自助平台全解析
,石家庄四十八中学官网?
临沂网站制作公司有哪些,临沂第四中学官网?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
建站之星如何实现PC+手机+微信网站五合一建站?
建站主机核心功能解析:服务器选择与网站搭建流程指南
大连 网站制作,大连天途有线官网?
建站VPS能否同时实现高效与安全翻墙?
如何用西部建站助手快速创建专业网站?
如何在橙子建站中快速调整背景颜色?
网站代码制作软件有哪些,如何生成自己网站的代码?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
公司门户网站制作流程,华为官网怎么做?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
如何用免费手机建站系统零基础打造专业网站?
长沙做网站要多少钱,长沙国安网络怎么样?
网站企业制作流程,用什么语言做企业网站比较好?
北京专业网站制作设计师招聘,北京白云观官方网站?
如何快速生成ASP一键建站模板并优化安全性?
c# 在ASP.NET Core中管理和取消后台任务
视频网站app制作软件,有什么好的视频聊天网站或者软件?
如何选择建站程序?包含哪些必备功能与类型?
建站之星好吗?新手能否轻松上手建站?
如何配置支付宝与微信支付功能?
如何快速搭建响应式可视化网站?
电商网站制作公司有哪些,1688网是什么意思?
家庭服务器如何搭建个人网站?
如何通过西部数码建站助手快速创建专业网站?
建站之星安装后如何配置SEO及设计样式?
建站VPS推荐:2025年高性能服务器配置指南
宁波免费建站如何选择可靠模板与平台?
网站网页制作专业公司,怎样制作自己的网页?
教学网站制作软件,学习*后期制作的网站有哪些?
建站之星后台管理:高效配置与模板优化提升用户体验
定制建站流程步骤详解:一站式方案设计与开发指南
建站主机功能解析:服务器选择与快速搭建指南
网站制作新手教程,新手建设一个网站需要注意些什么?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
SQL查询语句优化的实用方法总结
建站之星后台密码遗忘?如何快速找回?
建站之星北京办公室:智能建站系统与小程序生成方案解析
简单实现Android验证码
平台云上自主建站:模板化设计与智能工具打造高效网站
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
*请认真填写需求信息,我们会在24小时内与您取得联系。