数据库里有几百张表,几乎每个表(不是全部)中都有一个共同的字段"lngUserID"-->INT型,即"用户ID".
现在我想在删除"USERS"(用户表)里某条lngUserID之前,判断一下该lngUserID是否已在其他表中被引用,不想采用诸如"if exists(select lngUserID from item where lngUserID=@lngUserID)之类的写法,因为表太多了,能否用一句SQL搞定?另外,我没有去设lngUserID为外键,亦不采用触发器之类的做法.

解决方案 »

  1.   

    if exists(select name from syscolumns where name=@lngUserID)
    可以判断
      

  2.   

    select b.name ,a.* from syscolumns a,sysobjects b where a.id=b.id and a.name='字段名'
    可以查出有哪些表正在使用这个字段名
      

  3.   

    如果在引用该字段的表中将该字段'lngUserID'设为'users'表的外键,又该如何处理呢?--->求SQL语句进行判断.用sp_fkeys 'users' 可以得到外键表的信息,但这些外键表有没有利用过该外键发生过数据呢?又回到第一个问题上来了:难道非得一个表一个表地去 exists 吗?
      

  4.   

    当然你也可以把所有表都Join起来查本质上还是要把所有表都写一遍如果会写,用动态语句生成也不是不可以
      

  5.   

    如果用FK,那么用不带级联的FK在删除主表的ID时,没有涉及到从表时不会出错,如否,则会出错
      

  6.   

    TO:LouisXIV(夜游神) 
    是不是说根据返回的错误号,前台的应用程序告诉操作者"该用户已发生业务,不得删除!"?
      

  7.   

    唉,当初为了省事,而且觉得可以建立多表SELECT语句,联合父行和子行,而不必有PRIMARY KEY 和FOREIGN KEY 约束,就偷了个懒,但现在麻烦来了……看来:即使建交PK和FK要事先花一些计划精力,但这样做可以不必关心用户是否在父表中插入重复的行或者在子表里建立了孤行。
    懊悔中……