ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 存储过程获取表被引用的信息

存储过程获取表被引用的信息

原创 Linux操作系统 作者:iSQlServer 时间:2009-07-13 13:12:20 0 删除 编辑
可能题目取得不是很好,但我想看了文章就知道什么意思。
当你想删除一个表时,可能被其他表作为外键被引用,此时你想删除此表是删除不掉的。你必须把那引用此表为外键的表删掉,才能把你要删的表的删掉。可能文字不好表达。我就举个例子
当b,c表引用a表作为外键,你想删a表的某些数据,就一定要删除相关的b,c中引用a表的数据。可是b,c表可能又被其他表引用,这样肯定会导致一个递归。
如果按正常方法去删a表,你可能写删除语句来删除a表,但执行时会报错说那个表引用了此表,此时你根据报错信息会找到引用的表,又删除,又报错,又根据信息查找,此时我感觉很麻烦。
我就自己写了个存储过程。

按理来说要获取引用表的信息应该用递归来解决最好,但我试过,感觉在数据库中运用得没有c#好,才改变策略用过程来写。

代码如下


CREATE PROCEDURE dbo.usp_GetFeferenceTableInfo
@TableName nvarchar (50)
AS

SET NOCOUNT ON 
  
CREATE   TABLE   #ForeignKeyTABLEInfo
 (   
    PKTABLE_QUALIFIER   sysname   collate   database_default   
NULL,   
    PKTABLE_OWNER   sysname   collate   database_default   
NULL,   
    PKTABLE_NAME   sysname   collate   database_default   
NOT   NULL,   
    PKCOLUMN_NAME   sysname   collate   database_default   
NOT   NULL,   
    FKTABLE_QUALIFIER   sysname   collate   database_default   
NULL,   
    FKTABLE_OWNER   sysname   collate   database_default   
NULL,   
    FKTABLE_NAME   sysname   collate   database_default   
NOT   NULL,   
    FKCOLUMN_NAME   sysname   collate   database_default   
NOT   NULL,   
    KEY_SEQ   
smallint   NOT   NULL,   
    UPDATE_RULE   
smallint   NULL,   
    DELETE_RULE   
smallint   NULL,   
    FK_NAME   sysname   collate   database_default   
NULL,   
    PK_NAME   sysname   collate   database_default   
NULL,   
    DEFERRABILITY   
smallint   null
 )   
  
DECLARE @Level int 
  
DECLARE @ParentGetSubForNull int
  
DECLARE @SQL nvarchar (max)
  
SET @Level=0
  
SET @ParentGetSubForNull=1000
  

 
WHILE @ParentGetSubForNull<>0
    
BEGIN
        
PRINT @Level
        
IF @Level<>0 
            
BEGIN 
                
SET @SQL=''
                
SELECT  @SQL=@SQL+'INSERT   INTO   #ForeignKeyTABLEInfo EXEC   sp_fkeys  '+FKTABLE_NAME+''+CHAR(13)+CHAR(10FROM #ForeignKeyTABLEInfo WHERE  UPDATE_RULE=@Level
                
EXEC(@SQL)
                
PRINT @SQL
            
END 
        
ELSE 
            
INSERT   INTO   #ForeignKeyTABLEInfo     EXEC   sp_fkeys  @TableName 
        
        
SELECT @ParentGetSubForNull=COUNT(*FROM #ForeignKeyTABLEInfo WHERE KEY_SEQ=1

        
IF EXISTS (SELECT 1 FROM #ForeignKeyTABLEInfo WHERE KEY_SEQ=1)
        
BEGIN
            
UPDATE #ForeignKeyTABLEInfo SET UPDATE_RULE=@Level+1 WHERE KEY_SEQ=1
            
UPDATE #ForeignKeyTABLEInfo SET KEY_SEQ=2 
        
END
            
        
SET @Level=@Level+1
        
   
END
 
   
SELECT PKTABLE_NAME,PKCOLUMN_NAME,[Level]=UPDATE_RULE,FK_NAME,PK_NAME FROM #ForeignKeyTABLEInfo

 
SET NOCOUNT OFF

 返回的结果有几个字段,其中Level表示表被引用的深度,就是b,c引用a,d引用b,f引用c,则b,c表的深度是1,d,f表的深度是2.此时删a表直接可以从d,f开始删,从深度高到低来删表。还一个字段是PK_NAME表示那些表引用了要删的表。其他字段应该很清楚。

不知道谁能用递归实现此功能 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16436858/viewspace-608983/,如需转载,请注明出处,否则将追究法律责任。

上一篇: SQL语句资料
请登录后发表评论 登录
全部评论

注册时间:2008-10-17

  • 博文量
    1319
  • 访问量
    2074028