亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL Server中修改“用戶自定義表類型”問題的分析與方法

2024-08-31 01:05:05
字體:
來源:轉載
供稿:網友

前言

SQL Server開發過程中,為了傳入數據集類型的變量(比如接受C#中的DataTable類型變量),需要定義“用戶自定義表類型”,通過“用戶自定義表類型”可以接收二維數據集作為參數,在需要修改“用戶自定義表類型”的時候,增加字段,刪除字段,修改字段類型等,它沒有像表一樣的alter table語法來進行修改。

只能通過刪除重建來實現,但是在刪除“用戶自定義表類型”的時候會提示有對象引用它(某些存儲過程用到了這個“用戶自定義表類型”),因此無法刪除。

為了達到公用的目的,有時候一個TableType可以在多個地方分別被引用到,這樣的話,勢必要先刪除所有的引用了這個“用戶自定義表類型”的對象(存儲過程等)

如果這個“用戶自定義表類型”被多個存儲過程引用,那么就要分別刪除多個引用了“用戶自定義表類型”的存儲過程,然后修改“用戶自定義表類型”,在重建存儲過程,這樣做起來似乎有點繞,這個問題可以用過EXEC sys.sp_refreshsqlmodule這個系統函數來簡介實現“用戶自定義表類型”的定義

TableType的基本使用

如下創建一個用戶自定義表類型

sql,用戶自定義表類型,sqlserver自定義類型,sqlserver,自定義函數

定義的TableType可以在用戶自定義表類型中找到

sql,用戶自定義表類型,sqlserver自定義類型,sqlserver,自定義函數

創建兩個存儲過程,分別用到了上面定義的用戶自定義表類型,模擬用戶自定義表類型被引用的情況

sql,用戶自定義表類型,sqlserver自定義類型,sqlserver,自定義函數

此時的存儲過程可以接收TableType參數并正常運行

sql,用戶自定義表類型,sqlserver自定義類型,sqlserver,自定義函數

TableType的修改

TableType類型不支持alter語法,也即無法直接修改TableType的定義

sql,用戶自定義表類型,sqlserver自定義類型,sqlserver,自定義函數

那么只能通過刪除TableType的方法來重建這個TableType,當刪除的時候,仍然報錯,提示“因為它正由對象 '***' 引用??赡苓€有其他對象在引用此類型。”

sql,用戶自定義表類型,sqlserver自定義類型,sqlserver,自定義函數

此時只能刪除引用了這個TableType的對象來解決,下面可以查到那些對象引用了某一個TableType,然后分別刪除,重建TableType,再重建存儲過程,有點繞彎子。

sql,用戶自定義表類型,sqlserver自定義類型,sqlserver,自定義函數

可以先將自定義的某個TableType重命名,重命名的過程中有一個警告,這里先忽略它,隨后可以直接Drop Type dbo.MyTableType

sql,用戶自定義表類型,sqlserver自定義類型,sqlserver,自定義函數

刪除原TableType之后,重建(重定義)TableType

sql,用戶自定義表類型,sqlserver自定義類型,sqlserver,自定義函數

重建TableType之后,先前存儲過程中用到這個TableType的存儲過程是無法編譯通過的

sql,用戶自定義表類型,sqlserver自定義類型,sqlserver,自定義函數

此時就需要重新刷新引用對象的定義

sql,用戶自定義表類型,sqlserver自定義類型,sqlserver,自定義函數

刷新完成之后,原存儲過程就可以正常編譯了

sql,用戶自定義表類型,sqlserver自定義類型,sqlserver,自定義函數

最后刪除原始的TableType被重命名的TableType(被第一步重名的那個)

sql,用戶自定義表類型,sqlserver自定義類型,sqlserver,自定義函數

這樣子,整個過程就無需因為修改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 FORSELECT referencing_schema_name + '.' + referencing_entity_nameFROM 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_MyTableTypeGO--最后執行授權GRANT EXECUTE ON TYPE::dbo.MyTableType TO publicGO

總結:

TableType可以方便地接受二維數據作為參數,從而可以達到批量處理數據的目的,避免傳遞進去一大堆字符串,然后在對字符串解析的做法,從而可以在一定程度上提高sql的運行效率。

不過TableType的修改確實存在一定的問題,直接修改TableType會存在級聯刪除數據庫對象的情況,可以通過“曲線救國”的方式,來減小工作量的情況下修改TableType。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本在线观看天堂男亚洲| 在线播放精品一区二区三区| 黑人欧美xxxx| 亚洲欧美中文另类| 欧美日韩国产成人在线| 亚洲国产精品热久久| 91精品视频大全| 国产精品私拍pans大尺度在线| 国产精品久久视频| 亚洲大胆美女视频| 中文字幕一区二区三区电影| 欧美激情一区二区三区成人| 亚洲国产精品网站| 中文字幕精品一区二区精品| 欧美性猛交xxxx免费看漫画| 国产噜噜噜噜噜久久久久久久久| 色偷偷噜噜噜亚洲男人| 隔壁老王国产在线精品| 欧美极品美女电影一区| 亚洲欧洲激情在线| 欧美大全免费观看电视剧大泉洋| 欧美洲成人男女午夜视频| 欧美激情免费观看| 日韩免费高清在线观看| 5566成人精品视频免费| 26uuu日韩精品一区二区| 51精品国产黑色丝袜高跟鞋| 日本国产精品视频| 国产精品久久久久久久久久免费| 久久影院模特热| 国产精品久久激情| 精品日本美女福利在线观看| 日韩高清有码在线| 成人a在线观看| 日韩欧美国产成人| 亚洲肉体裸体xxxx137| 91在线精品视频| 亚洲第一二三四五区| 欧美日韩国产123| 成人性生交大片免费看小说| 95av在线视频| 欧美激情欧美激情| 欧美在线观看一区二区三区| 国产精品91视频| 欧美成人免费在线观看| 欧美怡红院视频一区二区三区| 亚洲精品资源美女情侣酒店| 九九九热精品免费视频观看网站| 国产精品va在线| 欧美性猛交丰臀xxxxx网站| 久久影视三级福利片| 国产在线拍偷自揄拍精品| 日韩美女av在线| 97国产精品免费视频| 国产精品免费久久久久影院| 欧美在线一级视频| 国产玖玖精品视频| 日韩少妇与小伙激情| 国产亚洲日本欧美韩国| 国产成人亚洲综合91精品| 欧美孕妇与黑人孕交| 91深夜福利视频| 日本亚洲精品在线观看| 国产狼人综合免费视频| 亚洲男子天堂网| 欧美日韩国产在线看| 国内精品模特av私拍在线观看| 韩剧1988免费观看全集| 午夜精品www| 国产精品久久久久久久久久尿| 美女精品视频一区| zzijzzij亚洲日本成熟少妇| 久久久www成人免费精品张筱雨| 国产精品久久久久久久久久尿| 日韩电影免费观看中文字幕| 亚洲九九九在线观看| 欧美色另类天堂2015| 日韩美女写真福利在线观看| 国内精品久久久久久中文字幕| 日韩av在线网址| 欧美日韩午夜视频在线观看| 日韩久久免费视频| 欧美性猛交视频| 日韩成人在线观看| 中文字幕精品视频| 国产精品久久久久aaaa九色| 国产精品自在线| 国产精品视频精品视频| 亚洲国产一区自拍| 精品久久久久久中文字幕大豆网| 色综合天天狠天天透天天伊人| 中文字幕国产亚洲| 国产精品久久久久免费a∨| 亚洲a中文字幕| 97视频网站入口| www.久久久久| 国产精品电影久久久久电影网| 亚洲石原莉奈一区二区在线观看| 日韩精品中文字幕视频在线| 国产精品免费在线免费| 欧美激情视频在线| 国产精品热视频| 2019最新中文字幕| 午夜精品久久久久久久男人的天堂| 日韩精品在线免费观看| 亚洲女同精品视频| 欧洲亚洲在线视频| 国产精品入口免费视频一| 午夜精品美女自拍福到在线| 亚洲精品videossex少妇| 日韩激情第一页| 国产精品美女av| 久久久久久久久久国产精品| 国产日产亚洲精品| 日韩精品有码在线观看| 欧美专区中文字幕| 亚洲在线第一页| 在线观看国产精品91| 欧美自拍视频在线| 国产精品自产拍在线观看中文| 久久久日本电影| 国产成人精品av在线| 国产精品视频一区国模私拍| 国产精品久久久久免费a∨大胸| 91亚洲永久免费精品| 曰本色欧美视频在线| 黑人巨大精品欧美一区二区一视频| 5566日本婷婷色中文字幕97| 久久九九国产精品怡红院| 奇米4444一区二区三区| 黑人巨大精品欧美一区二区一视频| 久久国产视频网站| 国产免费一区二区三区在线观看| 久久久久久久97| 97视频免费看| 2018中文字幕一区二区三区| 激情成人中文字幕| 亚洲91精品在线观看| 亚洲欧美制服综合另类| 尤物精品国产第一福利三区| 国产精品h在线观看| 懂色av影视一区二区三区| 欧美视频在线看| 欧美极品美女视频网站在线观看免费| 在线成人免费网站| 欧美日韩国产成人高清视频| 日韩成人免费视频| 日韩成人中文电影| 亚洲成色777777在线观看影院| 日韩性xxxx爱| 国产视频在线一区二区| 亚洲免费电影一区| 北条麻妃一区二区在线观看| 欧美视频在线观看免费| 国产日韩欧美夫妻视频在线观看| 亚洲va电影大全| 精品露脸国产偷人在视频| 全亚洲最色的网站在线观看| 成人激情视频在线播放| 欧美激情一区二区三级高清视频| 日韩精品免费综合视频在线播放| 欧美福利小视频| 国产精品香蕉在线观看| 国产精品成人品|