现有数据库A,B,C,表分别为a1.....an, b1......bn, c1......cn,
现在要检测每一个张表是否存在,能不能整合到一个存储结构中,通过表名作为输入参数判断是否存在该表,并返回0或者1作为输出参数,这样我就可以方便的循环调用了,另外因为有的表为空,所以没法通过返回行数进行判断。
恳请各位大侠拔刀相助~~~

解决方案 »

  1.   

    用不着吧.这样即可:select name from sysobjects where type='U' and
    ((left(name,2) between 'a1' and 'an') or 
    (left(name,2) between 'b1' and 'bn') or 
    (left(name,2) between 'c1' and 'cn') )
      

  2.   

    在每个库中运行这样一句话.select name from sysobjects where type='U' and
    ((left(name,2) between 'a1' and 'an') or 
    (left(name,2) between 'b1' and 'bn') or 
    (left(name,2) between 'c1' and 'cn') )如果需要所有表名的存在和不存在.先建立一个从a1..an,b1...bn,c1...cn的然后select m.tbname , case when exists (select 1 from (select name from sysobjects where type='U' and name = m.tbname)) then 1 else 0 end from
    (
    select 'a1' tbname union all
    select 'a2' tbname union all
    ...
    select 'an' tbname union all
    select 'b1' tbname union all
    select 'b2' tbname union all
    ...
    select 'bn' tbname union all
    select 'c1' tbname union all
    select 'c2' tbname union all
    ...
    select 'cn' tbname union all
    ) m
      

  3.   

    create proc sp_test(@tbname varchar(100),@result int output)
    as
    set @result=0;
    if exists(select 1 from db1.dbo.sysobjects where id=object_id(@tbname))
    or exists(select 1 from db2.dbo.sysobjects where id=object_id(@tbname))
    begin
      set @result=1
    end
    return @result
    godeclare @result int
    exec sp_test 'tb',@result output
    select @result
    godrop proc sp_test
    go
      

  4.   

    --以下为测试结果,你在每个库中运行即可,表名自己写全.create table a1(id int)
    create table a2(id int)
    create table b1(id int)
    create table b2(id int)
    create table c1(id int)
    create table c2(id int)
    goselect m.tbname , ifexists =
    (case when exists (select 1 from (select name from sysobjects where type='U') n where name = m.tbname) then 1 else 0 end) from
    (
    select 'a1' tbname union all
    select 'a2' tbname union all
    select 'a3' tbname union all
    select 'b1' tbname union all
    select 'b2' tbname union all
    select 'b3' tbname union all
    select 'c1' tbname union all
    select 'c2' tbname union all
    select 'c3' tbname 
    ) mdrop table a1 , a2 , b1 , b2 , c1 , c2/*
    tbname ifexists    
    ------ ----------- 
    a1     1
    a2     1
    a3     0
    b1     1
    b2     1
    b3     0
    c1     1
    c2     1
    c3     0(所影响的行数为 9 行)
    */
      

  5.   

    得到库名的方法为:USE master 
    SELECT dbid, DB_NAME(dbid) AS DB_NAME 
    FROM sysdatabases 
    ORDER BY dbid 
    GO 下面是结果集: dbid   DB_NAME                         
    ------ ------------------------------  
    1      master                          
    2      tempdb                          
    3      model                           
    4      msdb                            
    5      pubs                            (5 row(s) affected) 
    把上面的11楼的内容做成存储过程,使用游标在上面的库名查询中查询到每个库名,把库名做为参数传进存储过程即可.存储过程中加一句.
    exec('use 你传进的库名')
      

  6.   

    sgtzzc,dawugui
    谢谢2位,问题解决的太快了,接我一分~!!!!
      

  7.   

    CREATE DATABASE A
    CREATE DATABASE B
    CREATE DATABASE C
    GO
    USE A
    CREATE TABLE A1(COL1 INT)
    CREATE TABLE A2(COL1 INT)
    USE B
    CREATE TABLE B2(COL1 INT)
    CREATE TABLE B3(COL1 INT)
    USE C
    CREATE TABLE C1(COL1 INT)
    CREATE TABLE C3(COL1 INT)
    GO
    USE A
    DECLARE @MAX INT,@MIN INT
    SELECT @MAX=4,@MIN=1
    SELECT 'A' '数据库名称','A'+CAST(T2.[NUMBER] AS VARCHAR(50)) '表名'
    ,CASE WHEN T1.[NAME] IS NULL THEN '缺少' ELSE '存在' END '状态'
    FROM A.SYS.TABLES  T1
    RIGHT JOIN (SELECT [NUMBER] FROM MASTER..SPT_VALUES WHERE TYPE='P' AND [NUMBER] BETWEEN @MIN AND @MAX) T2 
    ON CAST(STUFF(T1.[NAME],1,1,'') AS INT)=T2.[NUMBER]
    AND T1.[NAME] LIKE 'A%' AND ISNUMERIC(STUFF(T1.[NAME],1,1,''))=1
    UNION ALL
    SELECT 'B' '数据库名称','B'+CAST(T2.[NUMBER] AS VARCHAR(50))
    ,CASE WHEN T1.[NAME] IS NULL THEN '缺少' ELSE '存在' END
    FROM B.SYS.TABLES  T1
    RIGHT JOIN (SELECT [NUMBER] FROM MASTER..SPT_VALUES WHERE TYPE='P' AND [NUMBER] BETWEEN @MIN AND @MAX) T2 
    ON CAST(STUFF(T1.[NAME],1,1,'') AS INT)=T2.[NUMBER]
    AND T1.[NAME] LIKE 'B%' AND ISNUMERIC(STUFF(T1.[NAME],1,1,''))=1
    UNION ALL
    SELECT 'C' '数据库名称','C'+CAST(T2.[NUMBER] AS VARCHAR(50))
    ,CASE WHEN T1.[NAME] IS NULL THEN '缺少' ELSE '存在' END
    FROM C.SYS.TABLES  T1
    RIGHT JOIN (SELECT [NUMBER] FROM MASTER..SPT_VALUES WHERE TYPE='P' AND [NUMBER] BETWEEN @MIN AND @MAX) T2 
    ON CAST(STUFF(T1.[NAME],1,1,'') AS INT)=T2.[NUMBER]
    AND T1.[NAME] LIKE 'C%' AND ISNUMERIC(STUFF(T1.[NAME],1,1,''))=1
    DROP DATABASE A
    DROP DATABASE B
    DROP DATABASE C
    /*
    A A1 存在
    A A2 存在
    A A3 缺少
    A A4 缺少
    B B1 缺少
    B B2 存在
    B B3 存在
    B B4 缺少
    C C1 存在
    C C2 缺少
    C C3 存在
    C C4 缺少
    */