問題的起因是這樣的,現在很多資料庫的設計喜歡使用GUID,因為這個資料是全域唯一,不會產生重復。但是過多的應用卻給理解和分析帶來麻煩,舉例說明,資料表有一個欄位:MemberStatus,欄位里都是參考GUID資料:
F9E42E1E-01E2-4831-B34E-D55E0A405855
3914fdef-9ecb-45ea-b44e-47c1a48ea41e
F9E42E1E-01E2-4831-B34E-D55E0A405855
3914fdef-9ecb-45ea-b44e-47c1a48ea41e
F9E42E1E-01E2-4831-B34E-D55E0A405855
這些資料對應的實際意義的資料在另一個表中描述,具體哪個表不知道,也很不容易找到,有沒有一種辦法,可以用GUID的值,在整個資料庫中查找,然后得到結果:
找到F9E42E1E-01E2-4831-B34E-D55E0A405855數值在下串列格出現以及出現的次數。
1:表1,欄位a,6次
2:表1,欄位b,1次
3:表2,欄位c,20次
4:表3,欄位d,3次
......
那么很容易理解,出現1次的,最有可能是定義這個資料實際意義的表格!
如果你有解決問題的方案,請麻煩告知,謝謝!
uj5u.com熱心網友回復:
"具體哪個表不知道,也很不容易找到"--> 建議聯系系統開發者咨詢或請其提供資料字典.
uj5u.com熱心網友回復:
,分析同行資料庫,無法聯系開發者。
uj5u.com熱心網友回復:
/*
測驗:
Exec sp_search 'F9E42E1E-01E2-4831-B34E-D55E0A405855'
思路:
先查詢出所有表所有GUID型別的欄位,然后統計欄位值等于@Val的個數,如果大于0,保存結果
如果資料量大的話,有點慢
如果你的值存的可能還有其他型別,那你要system_Type_ID = 36 改一下這句,這樣更慢更慢更慢
*/
CREATE Procedure sp_Search(@Val UNIQUEIDENTIFIER)
As
Begin
Declare @TBName Varchar(200)
Declare @ColName Varchar(200)
Declare @Rst int
Declare @Sql NVarchar(4000)
Declare @TB Table(TbName Varchar(200),ColName Varchar(200),Cnt INT)
Declare myCur Cursor For
Select A.Name,B.Name From sys.objects A Inner join sys.columns B on a.object_id=b.object_id
Where A.Type='U' And system_Type_ID = 36
Open myCur;
Fetch Next From myCur Into @TBName,@ColName
While @@FETCH_STATUS = 0
BEGIN
SET @Rst = 0
Set @Sql='Select @Rst = count(1) From ['+@TBName+'] Where ['+@ColName+'] = @Val)'
Exec sp_Executesql @sql,N'@Val UNIQUEIDENTIFIER,@Rst int output',@Val,@Rst output
If(@Rst>=1)
Insert Into @TB values(@TBName,@ColName,@Rst)
Fetch Next From myCur Into @TBName,@ColName
End
Close myCur
DeAllocate myCur
Select * From @TB
End
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/243055.html
標籤:應用實例
