動態記錄主表值被引用的行數

2021-09-01 14:56:37 字數 2662 閱讀 5356

db中存在主鍵人力human,由於日積月累的資料,再加上前期設定主外來鍵的混亂,有許多的子表裡的鍵都屬於human表中humanid,loginid,humanmonitorid的外來鍵,並且有些表根本沒有建立外來鍵但值卻存放著外鍵值。

現在要徹底刪除某些主表的值,但在刪除前需要找到這些值在其它表引用的資料有多行,所以就有了下面的解決方法:

if object_id ('p_jcxx_humanqueryhumanid') is not null

drop procedure p_jcxx_humanqueryhumanid

go

-- 傳入的主健id,返回的是引用行數

create procedure p_jcxx_humanqueryhumanid @humanid nvarchar(128),

@totalcount int output

as set nocount off

declare @num int;

declare @sql nvarchar(512);

declare @ptab nvarchar(50);

declare @pcol nvarchar(50);

declare @ftab nvarchar(50);

declare @fcol nvarchar(50);

declare @hmid nvarchar(50); -- 人力監控id

declare @lgid nvarchar(50); -- 人力登陸id

create table #t(

ptab nvarchar(128),

pcol nvarchar(128),

ftab nvarchar(128),

fcol nvarchar(128)

); select @hmid=humanmonitorid, @lgid=loginid from human where humanid = @humanid;

insert into #t

select rtable.name ptab, cn.name pcol, ftable.name ftab, fkcn.name fcol

from sysforeignkeys inner

join sysobjects ftable on sysforeignkeys.fkeyid = ftable.id inner

join sysobjects rtable on sysforeignkeys.rkeyid = rtable.id inner

join syscolumns fkcn on sysforeignkeys.fkeyid = fkcn.id and sysforeignkeys.fkey = fkcn.colid inner

join syscolumns cn on sysforeignkeys.rkeyid = cn.id and sysforeignkeys.rkey = cn.colid

where rtable.name in ('human')

-- 主表名,主列名,外表名,外列名(資料庫未建立外來鍵,但數值是屬於外健,手動指定)

insert into #t (ptab,pcol,ftab,fcol)

select 'human','humanid','monitormodifyhistory','humanid' union

select 'human','humanid','typicalpart','designer';

begin

declare datas cursor for select * from #t

open datas;

fetch next from datas into @ptab,@pcol,@ftab,@fcol

while @@fetch_status=0

begin

if @pcol ='humanid'

set @sql = 'select @i=count(' + @fcol + ') from [' + @ftab + '] where ' + @fcol + ' = '''+ @humanid + '''';

if @pcol ='loginid'

set @sql = 'select @i=count(' + @fcol + ') from [' + @ftab + '] where ' + @fcol + ' = '''+ @lgid + '''';

if @pcol ='humanmonitorid'

set @sql = 'select @i=count(' + @fcol + ') from [' + @ftab + '] where ' + @fcol + ' = '''+ @hmid + '''';

if @sql is not null

begin

exec sp_executesql @sql, n'@i int output',@num output

if @num >0

set @totalcount = @totalcount + @num;

end;

fetch next from datas into @ptab,@pcol,@ftab,@fcol

end;

close datas;

deallocate datas;;

end

動態陣列按值傳遞的引用

對於陣列的引用問題,我們在實際使用中不是很多,但是如果你做好的引用準備,你必須考慮好如何地進行初始化操作,如下 主程式private sub exam1 dim s as byte redim s 5 reada s 呼叫 end sub 子程式private sub reada byval ms ...

利用指標的指標,修改被調函式的區域性值 傳引用

說明 利用指標的指標可以允許被呼叫函式修改區域性指標變數和處理指標陣列。傳引用,可修改被調函式區域性值。傳值,不可修改被調函式區域性值。看 呼叫方法一 傳引用 可以修改外部變數 includeusing namespace std 函式功能 找第乙個負值 方法一 void findcredit in...

C 初學記錄(動態規劃 被3整除的子串行)

原題 牛客網 動態規劃dynamic programming 的入門級題目 題目描述 給你乙個長度為50的數字串,問你有多少個子序列構成的數字可以被3整除 答案對1e9 7取模 輸入描述 輸入乙個字串,由數字構成,長度小於等於50 輸出描述 輸出乙個整數 示例 輸入 132輸出 3正確 includ...