有一个数据库 db_temp 有N个表 a,b,c....我想写一个存储过程,得到这个数据下所有表满足条件的数据。该怎么实现。

解决方案 »

  1.   

    select name from sys.tables
      

  2.   

    select name from sys.tables where name like 条件
      

  3.   

    SELECT 表名=CASE WHEN a.colorder = 1 THEN d.name ELSE '' END, 表说明=CASE WHEN a.colorder = 1 THEN isnull(f.value, '') ELSE '' END , 字段序号=a.colorder , 字段名=a.name , 标识=CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity') = 1 THEN '√' ELSE '' END , 主键=CASE WHEN EXISTS (SELECT 1 FROM dbo.sysindexes si INNER JOIN     dbo.sysindexkeys sik ON si.id = sik.id AND si.indid = sik.indid INNER JOIN     dbo.syscolumns sc ON sc.id = sik.id AND sc.colid = sik.colid INNER JOIN     dbo.sysobjects so ON so.name = so.name AND so.xtype = 'PK'     WHERE sc.id = a.id AND sc.colid = a.colid) THEN '√' ELSE '' END , 
     外键=CASE WHEN tony.fkey is not null and tony.fkey=a.colid THEN '√' ELSE '' END , 
     外键表=CASE WHEN tony.fkey is not null and tony.fkey=a.colid THEN object_name(tony.fkeyid) ELSE '' END ,
     外键字段=CASE WHEN tony.fkey is not null and tony.fkey=a.colid THEN (SELECT name FROM syscolumns WHERE colid=tony.fkey AND id=tony.fkeyid) ELSE '' END,
    类型=b.name , 长度=a.length , 精度=COLUMNPROPERTY(a.id, a.name, 'PRECISION') , 小数位数=ISNULL(COLUMNPROPERTY(a.id, a.name, 'Scale'), 0) , 允许空=CASE WHEN a.isnullable = 1 THEN '√' ELSE '' END , 默认值= ISNULL(e.text, ''), 字段说明=ISNULL(g.[value], ''), 创建时间=d.crdate, 更改时间=CASE WHEN a.colorder = 1 THEN d.refdate ELSE NULL END     FROM dbo.syscolumns a LEFT OUTER JOIN     dbo.systypes b ON a.xtype = b.xusertype INNER JOIN     dbo.sysobjects d ON a.id = d.id AND d.xtype = 'U' AND     d.status >= 0 LEFT OUTER JOIN     dbo.syscomments e ON a.cdefault = e.id LEFT OUTER JOIN     sys.extended_properties g ON a.id = g.major_id AND a.colid = g.minor_id LEFT OUTER JOIN     sys.extended_properties f ON d.id = f.major_id AND f.minor_id = 0  LEFT JOIN
        
        sysobjects htl ON htl.parent_obj=d.id AND htl.xtype='F' LEFT JOIN
        
        sysforeignkeys tony on htl.id=tony.constid 
        
    where d.name='tb'  --这里输入包含表名称的条件    ORDER BY d.id, a.colorder
      

  4.   

    sp_msforeachtable 'select * from ? where 条件'
      

  5.   

    ------------------第一种方法----------------------CREATE PROC sp_ValueSearch
    @value sql_variant,  --要搜索的数据
    @precision bit=1     --1=仅根据sql_variant中的数据类型查找对应类型的数据列.<>1,查询兼容的所有列,字符数据使用like匹配
    AS
    SET NOCOUNT ON
    IF @value IS NULL RETURN--数据类型处理
    SELECT xtype INTO #t FROM systypes
    WHERE name=SQL_VARIANT_PROPERTY(@value,N'BaseType')--扩展数据类型及查询处理语句
    DECLARE @sql nvarchar(4000),@sql1 nvarchar(4000)
    IF @precision=1
        SET @sql=CASE SQL_VARIANT_PROPERTY(@value,N'BaseType')
            WHEN N'text' THEN N' LIKE N''%''+CAST(@value as varchar(8000))+''%'''
            WHEN N'ntext' THEN N' LIKE ''%''+CAST(@value as nvarchar(4000))+''%'''
            ELSE N'=@value' END
    ELSE
    BEGIN
        SET @sql=CAST(SQL_VARIANT_PROPERTY(@value,N'BaseType') as sysname)
        IF @sql LIKE N'%char' or @sql LIKE N'%text'
        BEGIN
            INSERT #t SELECT xtype FROM systypes
            WHERE name LIKE N'%char' or name LIKE N'%text'
            SELECT @sql=N' LIKE N''%''+CAST(@value as '
                +CASE 
                    WHEN LEFT(@sql,1)=N'n' THEN ' nvarchar(4000)'
                    ELSE 'varchar(8000)' END
                +N')+N''%'''
        END
        ELSE IF @sql LIKE N'%datetime'
        BEGIN
            INSERT #t SELECT xtype FROM systypes
            WHERE name LIKE N'%datetime'
            SET @sql=N'=@value'    
        END
        ELSE IF @sql LIKE N'%int' 
            OR @sql LIKE N'%money' 
            OR @sql IN(N'real',N'float',N'decimal',N'numeric')
        BEGIN
            INSERT #t SELECT xtype FROM systypes
            WHERE name LIKE N'%int' 
                OR name LIKE N'%money' 
                OR name IN(N'real',N'float',N'decimal')
            SET @sql=N'=@value'    
        END
        ELSE
            SET @sql=N'=@value'
    END
    --保存结果的临时表
    CREATE TABLE #(TableName sysname,FieldName sysname,Type sysname,SQL nvarchar(4000))DECLARE tb CURSOR LOCAL
    FOR
    SELECT N'SELECT * FROM '
        +QUOTENAME(USER_NAME(o.uid))
        +N'.'+QUOTENAME(o.name)
        +N' WHERE '+QUOTENAME(c.name)
        +@sql,
        N'INSERT # VALUES(N'+QUOTENAME(o.name,N'''')
        +N',N'+QUOTENAME(c.name,N'''')
        +N',N'+QUOTENAME(QUOTENAME(t.name)+CASE 
            WHEN t.name IN (N'decimal',N'numeric')
            THEN N'('+CAST(c.prec as varchar)+N','+CAST(c.scale as varchar)+N')'
            WHEN t.name=N'float'
                OR t.name like N'%char'
                OR t.name like N'%binary'
            THEN N'('+CAST(c.prec as varchar)+N')'
            ELSE N'' END,N'''')
        +N',@sql)'
    FROM sysobjects o,syscolumns c,systypes t,#t tt
    WHERE o.id=c.id
        AND c.xusertype=t.xusertype
        AND t.xtype=tt.xtype
        AND OBJECTPROPERTY(o.id,N'IsUserTable')=1OPEN tb
    FETCH tb INTO @sql,@sql1
    WHILE @@FETCH_STATUS=0
    BEGIN
        SET @sql1=N'IF EXISTS('+@sql+N') '+@sql1
        EXEC sp_executesql @sql1,N'@value sql_variant,@sql nvarchar(4000)',@value,@sql
        FETCH tb INTO @sql,@sql1
    END
    CLOSE tb
    DEALLOCATE tb
    SELECT * FROM #exec sp_ValueSearch '要搜索的值',1 --1或不输入(即默认值1)精确匹配
    exec sp_ValueSearch '要搜索的值',0 --不等于1,模糊匹配---------------第二种方法------------------Create   PROC xb_GetTableNameAndColNameForValue
     @value varchar(200)
    AS
    --求test库中包含值为@value的表和列名--存储表名和列名
    IF object_id('tabss') IS NOT NULL 
     exec('drop table tabss')
    CREATE TABLE Tabss(id int identity(1,1),tabname varchar(100),colName varchar(100))--查询某表某列是否包含某个值
    IF object_id('ysgs') IS NOT NULL
     exec('drop proc ysgs')
    exec('create PROC ysgs(@tab varchar(100),@col varchar(100))
    AS
    exec(''select 1 from ''+@tab+'' where ''+@col+'' like ''''%'+@value+'%'''''')')--将结果存入tabss表中
    EXEC master.dbo.xp_execresultset 'SELECT ''exec ysgs ''''''+object_name(id)+'''''',''''''+name+'''''';if @@rowcount>0  insert tabss (colname,tabname)values(''''''+name+'''''',''''''+object_name(id)+'''''')'' FROM syscolumns s WHERE xtype in(SELECT xtype FROM systypes s2 WHERE name in(''char'',''varchar'',''nchar'',''nvarchar''))
    AND id in(SELECT id FROM sysobjects s2 WHERE xtype=''u'')',N'test'
    GO
    /*调用
    exec xb_GetTableNameAndColNameForValue 'aa_1'
    SELECT * FROM tabss
    */------------------------第三种方法---------------------
    declare @name nvarchar(100)
    declare cur cursor for select name from sysobjects where type = 'U'
    open cur
    fetch next from cur into @name
    WHILE @@FETCH_STATUS = 0
    begin    declare @sql nvarchar(500),@s varchar(500)
        set @s =''
        set @sql='select @s=isnull(@s+''+'','''')+'''''',''''''+''+cast(''+name+'' as varchar)'' from syscolumns where id=object_id('''+@name+''') and xtype in(175,239,99,231,35,167) ' 
        exec sp_executesql @sql,N'@s varchar(500) out',@s out
        if len(@s) > 0 
            exec ('if exists(select 1 from (select '+ @s+' as col from ['+@name+']) b where charindex(''aa'',col)>0) print '''+@name+'''')
        fetch next from cur into @name
    end
    close cur
    DEALLOCATE cur------第4种方法---------(来自小梁)CREATE TABLE tb(id int,col varchar(20))
    CREATE TABLE tb2(id int,data varchar(20))INSERT tb VALUES(1,'中国');
    INSERT tb VALUES(2,'liangck')INSERT tb2 VALUES(1,'China')
    GOCREATE PROCEDURE dbo.FindString
        @string NVARCHAR(100)
    AS    DECLARE @SQL NVARCHAR(4000);
        SET @SQL = N'
                DECLARE @str NVARCHAR(4000);
                SELECT
                    @str = ISNULL(@str + N'' OR '' + c.name + N'' LIKE N''''%' 
                                                    + @string + ' %'''''',
                                   c.name + N'' LIKE N''''%' + @string +'%'''''') FROM syscolumns AS c JOIN systypes AS t ON c.id=OBJECT_ID(''?'')
                    AND c.xtype=t.xtype
                    AND t.name IN(''varchar'',''char'',''nvarchar'',''nchar'');            SET @str = ''SELECT TOP 1 1 FROM ? WHERE ''+@str;
                CREATE TABLE #tb(a int);
                INSERT #tb(a) EXEC(@str);
                IF EXISTS(SELECT * FROM #tb)
                    PRINT ''?''
            ';
        EXEC sp_MsforeachTable @SQL;
    GOEXEC dbo.FindString N'中国'GO
    DROP PROCEDURE dbo.FindString
    DROP TABLE tb,tb2
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fredrickhu/archive/2009/09/20/4574197.aspx
      

  6.   


    方法1:
    declare @name nvarchar(100)
    declare cur cursor for select name from sysobjects where type = 'U'
    open cur
    fetch next from cur into @name
    WHILE @@FETCH_STATUS = 0
    begin
        /*
        @name 为表名字,可以用动态SQL语句拼接,然后执行
        
         */
       
        fetch next from cur into @name
    end
    close cur
    DEALLOCATE cur
    方法2:
    EXEC SP_MSFOREACHTABLE 'SELECT TOP 1 * FROM  ? WHERE 1=1'
      

  7.   

    所有表都一样?
    如果是要结构则参考如下:
    --查询出各(某)表字段的属性--sql server 2000
    SELECT 
        表名       = case when a.colorder=1 then d.name else '' end,
        表说明     = case when a.colorder=1 then isnull(f.value,'') else '' end,
        字段序号   = a.colorder,
        字段名     = a.name,
        标识       = case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end,
        主键       = case when exists(SELECT 1 FROM sysobjects where xtype='PK' and parent_obj=a.id and name in (
                         SELECT name FROM sysindexes WHERE indid in(
                            SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid))) then '√' else '' end,
        类型       = b.name,
        占用字节数 = a.length,
        长度       = COLUMNPROPERTY(a.id,a.name,'PRECISION'),
        小数位数   = isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),
        允许空     = case when a.isnullable=1 then '√'else '' end,
        默认值     = isnull(e.text,''),
        字段说明   = isnull(g.[value],'')
    FROM 
        syscolumns a
    left join 
        systypes b 
    on 
        a.xusertype=b.xusertype
    inner join 
        sysobjects d 
    on 
        a.id=d.id  and d.xtype='U' and  d.name<>'dtproperties'
    left join 
        syscomments e 
    on 
        a.cdefault=e.id
    left join 
        sysproperties g 
    on 
        a.id=g.id and a.colid=g.smallid  
    left join 
        sysproperties f 
    on 
        d.id=f.id and f.smallid=0
    where 
        d.name='要查询的表'    --如果只查询指定表,加上此条件
    order by 
        a.id,a.colorder/*
    表名    表说明 字段序号 字段名    标识 主键    类型    占用字节数 长度 小数位数 允许空  默认值      字段说明 
    ------- ----- -------  -------- ---- ------- ------ ------- --------------- ------ ---------- ---------- 
    authors       1        au_id          √     id      11     11      0                          
                  2        au_lname              varchar 40     40      0                          
                  3        au_fname              varchar 20     20      0                          
                  4        phone                 char    12     12      0              ('UNKNOWN') 
                  5        address               varchar 40     40      0       √                 
                  6        city                  varchar 20     20      0       √                 
                  7        state                 char    2      2       0       √                 
                  8        zip                   char    5      5       0       √                 
                  9        contract              bit     1      1       0                          
    (所影响的行数为 9 行)
    */
    --sql server 2005
    -- 1. 表结构信息查询 
    -- ========================================================================
    -- 表结构信息查询
    -- 邹建 2005.08(引用请保留此信息)
    -- ========================================================================
    SELECT 
        TableName=CASE WHEN C.column_id=1 THEN O.name ELSE N'' END,
        TableDesc=ISNULL(CASE WHEN C.column_id=1 THEN PTB.[value] END,N''),
        Column_id=C.column_id,
        ColumnName=C.name,
        PrimaryKey=ISNULL(IDX.PrimaryKey,N''),
        [IDENTITY]=CASE WHEN C.is_identity=1 THEN N'√'ELSE N'' END,
        Computed=CASE WHEN C.is_computed=1 THEN N'√'ELSE N'' END,
        Type=T.name,
        Length=C.max_length,
        Precision=C.precision,
        Scale=C.scale,
        NullAble=CASE WHEN C.is_nullable=1 THEN N'√'ELSE N'' END,
        [Default]=ISNULL(D.definition,N''),
        ColumnDesc=ISNULL(PFD.[value],N''),
        IndexName=ISNULL(IDX.IndexName,N''),
        IndexSort=ISNULL(IDX.Sort,N''),
        Create_Date=O.Create_Date,
        Modify_Date=O.Modify_date
    FROM sys.columns C
        INNER JOIN sys.objects O
            ON C.[object_id]=O.[object_id]
                AND O.type='U'
                AND O.is_ms_shipped=0
        INNER JOIN sys.types T
            ON C.user_type_id=T.user_type_id
        LEFT JOIN sys.default_constraints D
            ON C.[object_id]=D.parent_object_id
                AND C.column_id=D.parent_column_id
                AND C.default_object_id=D.[object_id]
        LEFT JOIN sys.extended_properties PFD
            ON PFD.class=1 
                AND C.[object_id]=PFD.major_id 
                AND C.column_id=PFD.minor_id
    --             AND PFD.name='Caption'  -- 字段说明对应的描述名称(一个字段可以添加多个不同name的描述)
        LEFT JOIN sys.extended_properties PTB
            ON PTB.class=1 
                AND PTB.minor_id=0 
                AND C.[object_id]=PTB.major_id
    --             AND PFD.name='Caption'  -- 表说明对应的描述名称(一个表可以添加多个不同name的描述) 
        LEFT JOIN                       -- 索引及主键信息
        (
            SELECT 
                IDXC.[object_id],
                IDXC.column_id,
                Sort=CASE INDEXKEY_PROPERTY(IDXC.[object_id],IDXC.index_id,IDXC.index_column_id,'IsDescending')
                    WHEN 1 THEN 'DESC' WHEN 0 THEN 'ASC' ELSE '' END,
                PrimaryKey=CASE WHEN IDX.is_primary_key=1 THEN N'√'ELSE N'' END,
                IndexName=IDX.Name
            FROM sys.indexes IDX
            INNER JOIN sys.index_columns IDXC
                ON IDX.[object_id]=IDXC.[object_id]
                    AND IDX.index_id=IDXC.index_id
            LEFT JOIN sys.key_constraints KC
                ON IDX.[object_id]=KC.[parent_object_id]
                    AND IDX.index_id=KC.unique_index_id
            INNER JOIN  -- 对于一个列包含多个索引的情况,只显示第1个索引信息
            (
                SELECT [object_id], Column_id, index_id=MIN(index_id)
                FROM sys.index_columns
                GROUP BY [object_id], Column_id
            ) IDXCUQ
                ON IDXC.[object_id]=IDXCUQ.[object_id]
                    AND IDXC.Column_id=IDXCUQ.Column_id
                    AND IDXC.index_id=IDXCUQ.index_id
        ) IDX
            ON C.[object_id]=IDX.[object_id]
                AND C.column_id=IDX.column_id 
    -- WHERE O.name=N'要查询的表'       -- 如果只查询指定表,加上此条件
    ORDER BY O.name,C.column_id -- 2. 索引及主键信息 
    -- ========================================================================
    -- 索引及主键信息
    -- 邹建 2005.08(引用请保留此信息)
    -- ========================================================================
    SELECT 
        TableId=O.[object_id],
        TableName=O.Name,
        IndexId=ISNULL(KC.[object_id],IDX.index_id),
        IndexName=IDX.Name,
        IndexType=ISNULL(KC.type_desc,'Index'),
        Index_Column_id=IDXC.index_column_id,
        ColumnID=C.Column_id,
        ColumnName=C.Name,
        Sort=CASE INDEXKEY_PROPERTY(IDXC.[object_id],IDXC.index_id,IDXC.index_column_id,'IsDescending')
            WHEN 1 THEN 'DESC' WHEN 0 THEN 'ASC' ELSE '' END,
        PrimaryKey=CASE WHEN IDX.is_primary_key=1 THEN N'√'ELSE N'' END,
        [UQIQUE]=CASE WHEN IDX.is_unique=1 THEN N'√'ELSE N'' END,
        Ignore_dup_key=CASE WHEN IDX.ignore_dup_key=1 THEN N'√'ELSE N'' END,
        Disabled=CASE WHEN IDX.is_disabled=1 THEN N'√'ELSE N'' END,
        Fill_factor=IDX.fill_factor,
        Padded=CASE WHEN IDX.is_padded=1 THEN N'√'ELSE N'' END
    FROM sys.indexes IDX
        INNER JOIN sys.index_columns IDXC
            ON IDX.[object_id]=IDXC.[object_id]
                AND IDX.index_id=IDXC.index_id
        LEFT JOIN sys.key_constraints KC
            ON IDX.[object_id]=KC.[parent_object_id]
                AND IDX.index_id=KC.unique_index_id
        INNER JOIN sys.objects O
            ON O.[object_id]=IDX.[object_id]
        INNER JOIN sys.columns C
            ON O.[object_id]=C.[object_id]
                AND O.type='U'
                AND O.is_ms_shipped=0
                AND IDXC.Column_id=C.Column_id
    --    INNER JOIN  -- 对于一个列包含多个索引的情况,只显示第1个索引信息
    --    (
    --        SELECT [object_id], Column_id, index_id=MIN(index_id)
    --        FROM sys.index_columns
    --        GROUP BY [object_id], Column_id
    --    ) IDXCUQ
    --        ON IDXC.[object_id]=IDXCUQ.[object_id]
    --            AND IDXC.Column_id=IDXCUQ.Column_id
      

  8.   


    declare @str varchar(100)
    set @str='a'  --要搜索的字符串declare @s varchar(8000)
    declare tb cursor local for
    select s='if exists(select 1 from ['+b.name+'] where ['+a.name+'] like ''%'+@str+'%'')
    print '' ['+b.name+'].['+a.name+']'''
    from syscolumns a join sysobjects b on a.id=b.id
    where b.xtype='U' and a.status>=0
    and a.xusertype in(175,239,231,167)
    open tb
    fetch next from tb into @s
    while @@fetch_status=0
    begin
    exec(@s)
    fetch next from tb into @s
    end
    close tb
    deallocate tb
      

  9.   

    modify:declare @str varchar(100)
    set @str='a'  --要搜索的字符串declare @s varchar(8000)
    declare tb cursor local for
    select 'if exists(select 1 from ['+b.name+'] where ['+a.name+'] like ''%'+@str+'%'')
    print '' ['+b.name+'].['+a.name+']'''
    from syscolumns a join sysobjects b on a.id=b.id
    where b.xtype='U' and a.status>=0
    and a.xusertype in(175,239,231,167)
    open tb
    fetch next from tb into @s
    while @@fetch_status=0
    begin
    exec(@s)
    fetch next from tb into @s
    end
    close tb
    deallocate tb