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