Sql 检测外键……

USE [LF-eITS]

GO

/****** 对象:  StoredProcedure [dbo].[CheckFKRecord]    脚本日期: 09/09/2010 14:16:42 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

 

-- =============================================

-- Author: <Author,,Name>

-- Create date: <Create Date,,>

-- Description: <Description,,>

-- =============================================

ALTER PROCEDURE [dbo].[CheckFKRecord]

@tbname            sysname,                -- 基础数据表名

@stWhere           nvarchar(1000),     -- 基础数据表的条件表达式

@ExceptTBname1            sysname,  

@ExceptTBname2            sysname,  

@ExceptTBname3            sysname,  

@ExceptTBname4            sysname, 

@ExceptTBname5            sysname, 

@ExceptTBname6            sysname, 

@ExceptTBname7            sysname, 

@ExceptTBname8            sysname, 

@ExceptTBname9            sysname, 

@ExceptTBname10           sysname

AS

 

Declare @PField               sysname 

Declare @FTable              sysname 

Declare @LastFTable              sysname 

Declare @FField               sysname 

Declare @FKName           sysname 

Declare @LastFKName    sysname 

Declare @s                        nvarchar(4000)

Declare @bz                      bit

Declare @NoConstrain      bit

 

Select @LastFKName = ''

Select @s = ''

Select @NoConstrain = 1

 

Declare Table_cur Cursor  LOCAL

 

For

 

SELECT 

       QUOTENAME((SELECT name FROM syscolumns WHERE colid = B.rkey AND id = B.rkeyid)) As PField,

       QUOTENAME(OBJECT_NAME(B.fkeyid)) As FTable, QUOTENAME((SELECT name FROM syscolumns WHERE colid = B.fkey AND id = B.fkeyid)) As FField,

       A.name

FROM 

        sysobjects A  JOIN sysforeignkeys B ON A.id=  B.constid

        JOIN sysobjects C ON A.parent_obj = C.id

WHERE 

        A.xtype = 'f' AND C.xtype = 'U' AND OBJECT_NAME(B.rkeyid) = @tbname And QUOTENAME(OBJECT_NAME(B.fkeyid)) Not In (@ExceptTBname1,  @ExceptTBname2  ,  @ExceptTBname3,  @ExceptTBname4 , @ExceptTBname5, @ExceptTBname6, @ExceptTBname7 , @ExceptTBname8 , @ExceptTBname9, @ExceptTBname10  )

Order By A.name

 

Open Table_cur

 

Fetch Next From Table_cur Into @PField, @FTable, @FField, @FKName 

 

Select @LastFTable = @FTable

 

While @@Fetch_Status=0

 

Begin

                  Select @NoConstrain = 0

                  If @FKName <> @LastFKName 

                       Begin 

                            If @LastFKName  <> ''

                            Begin

                                 Select @s = N'SET @bz = CASE WHEN EXISTS('  + @s + N' Where ' + @stWhere +   N') THEN 1 ELSE 0 END'

                                 EXEC sp_executesql @s, N'@bz bit OUT', @bz OUT

                                 IF @bz = 1

                                 BEGIN

                                       Select @LastFTable as FTable

                                       Return

                                 End                                        

                            End 

                            Select @s = N'Select Top 1 * From ' + @tbname + N' P Join ' + @FTable + N' F On P.' + @PField + N'=F.' + @FField

                       End    

                  Else

                       Begin

                            Select @s = @s + N' And P.' + @PField + N'=F.' + @FField                 

                       End

 

                  Select @LastFKName = @FKName 

                  Select @LastFTable = @FTable

 

Fetch Next From Table_cur Into @PField, @FTable, @FField, @FKName 

End

 

Close Table_cur

 

Deallocate Table_cur

 

If @NoConstrain = 1

Begin

      Select '' as FTable

      Return

End     

 

If @s <> '' 

Begin

     Select @s = N'SET @bz = CASE WHEN EXISTS('  + @s + N' Where ' + @stWhere +   N') THEN 1 ELSE 0 END'

     EXEC sp_executesql @s, N'@bz bit OUT', @bz OUT

     IF @bz = 1

          BEGIN

                 Select @LastFTable as FTable

                 Return

          End                                        

     Else

           Begin

                 Select '' as FTable

                 Return

           End                     

End    

 

Select '' as FTable

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值