我现在用SQL语句修改表中某列的数据类型,但是该列上有个索引约束不让修改,我的方案是先把索引删除,修改之后在再把索引加上,但是现在我能实现“删除索引”和“修改数据类型”,至于怎么加上(还原)索引,我就不知道了,我想向各位讨这样一条SQL语句:能查询出索引名、索引类型(唯一、聚集、非聚集)、表名、列名的语句,用来还原索引

解决方案 »

  1.   

    drop index
    create index
      

  2.   

    在企业管理器里右击表,执行编写表脚本为-->create 到-->新窗口,你就能得到你想要的一切了.
      

  3.   

     
      SELECT * FROM  sys.INDEXES 
      

  4.   

    不好意思 ,忘说了,我的是Sql 2000数据库
      

  5.   

    2000:
    右击数据库-->所有任务-->生成SQL脚本
    在弹出窗口的设置格式里选"为每个对象生成create.."
    在选项中选中"编写索引脚本"大概是这样.
      

  6.   

    --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--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
      

  7.   

    --查询用户表对象信息
    select  Tab.Name as [表名],Tab.create_date as [创建时间],Tab.modify_date  as [最后修改时间],
            Col.Name  as [列名] ,Type.name as [数据类型],Col.max_length as [字段长度],
            CASE WHEN pk.is_primary_key= 1 THEN 'Y' ELSE 'N' end as [是否主键],
            CASE WHEN Col.is_identity = 1 THEN 'Y' else 'N'end as [是否自增] ,
            identity_columns.seed_value as [自增种子],identity_columns.increment_value as [自增步长],
            case when Col.is_nullable = 1 then 'Y' else 'N' END AS [是否允许为NULL],
            Def.text as [默认值],case when Col.is_computed = 1 then 'Y' else 'N' END as [是否计算列] ,
            computed_columns.definition as [计算公式],Col_Desc.Value as [列备注]
    from sys.objects Tab inner join sys.columns Col on Tab.object_id =Col.object_id
    inner join sys.types Type on Col.system_type_id = Type.system_type_id
    left join sys.identity_columns identity_columns on  Tab.object_id = identity_columns.object_id and Col.column_id = identity_columns.column_id
    left join syscomments Def  on Col.default_object_id = Def.ID
    left join(
        select index_columns.object_id,index_columns.column_id,indexes.is_primary_key 
        from sys.indexes  indexes inner join sys.index_columns index_columns 
        on indexes.object_id = index_columns.object_id and indexes.index_id = index_columns.index_id
        where indexes.is_primary_key = 1/*主键*/
    ) PK on Tab.object_id = PK.object_id AND Col.column_id = PK.column_id
    left join sys.computed_columns  computed_columns on Tab.object_id =computed_columns.object_id and Col.column_id = computed_columns.column_id
    left join sys.extended_properties Col_Desc on Col_Desc.major_id=Tab.object_id and Col_Desc.minor_id=Col.Column_id and Col_Desc.class=1 
    where Tab.type = 'U' and Tab.Name not like'sys%'
    order by Tab.create_date--查询所有视图
    select views.Name as [视图名],Col.Name as [列名] ,Type.name as [数据类型],Col.max_length as [字段长度]
            --,Col_Desc.Value as Col_Description
    from sys.views views
    inner join sys.columns Col on views.object_id  = Col.object_id
    inner join sys.types Type on Col.system_type_id = Type.system_type_id
    --left join sys.extended_properties Col_Desc 
    --    on Col_Desc.major_id=views.object_id and Col_Desc.minor_id=Col.Column_id and Col_Desc.class=1 
    order by Create_Date
    --查询外键约束
    select FK_Name as [外键名],Parent_Tab_Name as [外键表],
        [外键列]=stuff((select ','+[Parent_Col_Name] from (
            select    FK.name as FK_Name,Parent_Tab.Name as Parent_Tab_Name,Parent_Col.Name as Parent_Col_Name,
                    Referenced_Tab.Name as Referenced_Tab_Name,Referenced_Col.Name as Referenced_Col_Name
            from sys.foreign_keys FK
            inner join sys.foreign_key_columns Col on FK.Object_ID = Col.constraint_object_id
            inner join sys.objects Parent_Tab ON  Col.parent_object_id = Parent_Tab.Object_ID and Parent_Tab.TYPE = 'U'
            inner join sys.columns Parent_Col on Parent_Tab.Object_ID = Parent_Col.object_id 
                                                and  Col.parent_column_id = Parent_Col.column_id
            inner join sys.objects Referenced_Tab ON  Col.referenced_object_id = Referenced_Tab.Object_ID and Referenced_Tab.TYPE = 'U'
            inner join sys.columns Referenced_Col on Referenced_Tab.Object_ID = Referenced_Col.object_id 
                                                and  Col.referenced_column_id = Referenced_Col.column_id
        )t where FK_Name=tb.FK_Name  and Parent_Tab_Name = tb.Parent_Tab_Name and Referenced_Tab_Name = tb.Referenced_Tab_Name   for xml path('')), 1, 1, ''),
        Referenced_Tab_Name as  [主键表],
        [主键列]=stuff((select ','+[Referenced_Col_Name] from (
            select    FK.name as FK_Name,Parent_Tab.Name as Parent_Tab_Name,Parent_Col.Name as Parent_Col_Name,
                    Referenced_Tab.Name as Referenced_Tab_Name,Referenced_Col.Name as Referenced_Col_Name
            from sys.foreign_keys FK
            inner join sys.foreign_key_columns Col on FK.Object_ID = Col.constraint_object_id
            inner join sys.objects Parent_Tab ON  Col.parent_object_id = Parent_Tab.Object_ID and Parent_Tab.TYPE = 'U'
            inner join sys.columns Parent_Col on Parent_Tab.Object_ID = Parent_Col.object_id 
                                                and  Col.parent_column_id = Parent_Col.column_id
            inner join sys.objects Referenced_Tab ON  Col.referenced_object_id = Referenced_Tab.Object_ID and Referenced_Tab.TYPE = 'U'
            inner join sys.columns Referenced_Col on Referenced_Tab.Object_ID = Referenced_Col.object_id 
                                                and  Col.referenced_column_id = Referenced_Col.column_id
        )t where FK_Name=tb.FK_Name  and Parent_Tab_Name = tb.Parent_Tab_Name and Referenced_Tab_Name = tb.Referenced_Tab_Name   for xml path('')), 1, 1, '')
        --as [外键列]
    from (
        select    FK.name as FK_Name,Parent_Tab.Name as Parent_Tab_Name,Parent_Col.Name as Parent_Col_Name,
                Referenced_Tab.Name as Referenced_Tab_Name,Referenced_Col.Name as Referenced_Col_Name
        from sys.foreign_keys FK
        inner join sys.foreign_key_columns Col on FK.Object_ID = Col.constraint_object_id
        inner join sys.objects Parent_Tab ON  Col.parent_object_id = Parent_Tab.Object_ID and Parent_Tab.TYPE = 'U'
        inner join sys.columns Parent_Col on Parent_Tab.Object_ID = Parent_Col.object_id 
                                            and  Col.parent_column_id = Parent_Col.column_id
        inner join sys.objects Referenced_Tab ON  Col.referenced_object_id = Referenced_Tab.Object_ID and Referenced_Tab.TYPE = 'U'
        inner join sys.columns Referenced_Col on Referenced_Tab.Object_ID = Referenced_Col.object_id 
                                            and  Col.referenced_column_id = Referenced_Col.column_id
    )tb
    group by FK_Name,Parent_Tab_Name,Referenced_Tab_Name
    --查询所有存储过程
    select Pr_Name  as [存储过程], [参数]=stuff((select ','+[Parameter] 
        from (
            select Pr.Name as Pr_Name,parameter.name +' ' +Type.Name + ' ('+convert(varchar(32),parameter.max_length)+')' as Parameter
            from sys.procedures Pr left join 
            sys.parameters parameter  on Pr.object_id = parameter.object_id
            inner join sys.types Type on parameter.system_type_id = Type.system_type_id
            where type = 'P' 
        ) t where Pr_Name=tb.Pr_Name for xml path('')), 1, 1, '')
    from (
        select Pr.Name as Pr_Name,parameter.name +' ' +Type.Name + ' ('+convert(varchar(32),parameter.max_length)+')' as Parameter
        from sys.procedures Pr left join 
        sys.parameters parameter  on Pr.object_id = parameter.object_id
        inner join sys.types Type on parameter.system_type_id = Type.system_type_id
        where type = 'P' 
    )tb
    where Pr_Name not like 'sp_%' --and Pr_Name not like 'dt%'
    group by Pr_Name
    order by Pr_Name--查询所有触发器
    select triggers.name as [触发器],tables.name as [表名],triggers.is_disabled as [是否禁用],
    triggers.is_instead_of_trigger AS [触发器类型],
    case when triggers.is_instead_of_trigger = 1 then 'INSTEAD OF'
         when triggers.is_instead_of_trigger = 0 then 'AFTER'
         else null
    end as [触发器类型描述]
    from sys.triggers triggers
    inner join sys.tables tables on triggers.parent_id = tables.object_id
    where triggers.type ='TR'
    order by triggers.create_date--查询所有索引
    select    indexs.Tab_Name  as [表名],indexs.Index_Name as [索引名] ,indexs.[Co_Names] as [索引列],
            Ind_Attribute.is_primary_key as [是否主键],Ind_Attribute.is_unique AS [是否唯一键],
            Ind_Attribute.is_disabled AS [是否禁用]
     from (
        select Tab_Name,Index_Name, [Co_Names]=stuff((select ','+[Co_Name] from 
        (    select tab.Name as Tab_Name,ind.Name as Index_Name,Col.Name as Co_Name from sys.indexes ind 
            inner join sys.tables tab on ind.Object_id = tab.object_id and ind.type in (1,2)/*索引的类型:0=堆/1=聚集/2=非聚集/3=XML*/
            inner join sys.index_columns index_columns on tab.object_id = index_columns.object_id and ind.index_id = index_columns.index_id
            inner join sys.columns Col on tab.object_id = Col.object_id and index_columns.column_id = Col.column_id
        ) t where Tab_Name=tb.Tab_Name and Index_Name=tb.Index_Name  for xml path('')), 1, 1, '')
        from (
            select tab.Name as Tab_Name,ind.Name as Index_Name,Col.Name as Co_Name from sys.indexes ind 
            inner join sys.tables tab on ind.Object_id = tab.object_id and ind.type in (1,2)/*索引的类型:0=堆/1=聚集/2=非聚集/3=XML*/
            inner join sys.index_columns index_columns on tab.object_id = index_columns.object_id and ind.index_id = index_columns.index_id
            inner join sys.columns Col on tab.object_id = Col.object_id and index_columns.column_id = Col.column_id
        )tb
        where Tab_Name not like 'sys%'
        group by Tab_Name,Index_Name
    ) indexs inner join sys.indexes  Ind_Attribute on indexs.Index_Name = Ind_Attribute.name
    order by indexs.Tab_Name
      

  8.   

    "--查询所有索引
       ……
    "
    这段代码 在查询分析器里报错啊:

    服务器: 消息 170,级别 15,状态 1,行 10
    第 10 行: 'xml' 附近有语法错误。
    服务器: 消息 170,级别 15,状态 1,行 16
    第 16 行: 'tb' 附近有语法错误。
      

  9.   

    --查询所有索引
    select    indexs.Tab_Name  as [表名],indexs.Index_Name as [索引名] ,indexs.[Co_Names] as [索引列],
            Ind_Attribute.is_primary_key as [是否主键],Ind_Attribute.is_unique AS [是否唯一键],
            Ind_Attribute.is_disabled AS [是否禁用]
     from (
        select Tab_Name,Index_Name, [Co_Names]=stuff((select ','+[Co_Name] from 
        (    select tab.Name as Tab_Name,ind.Name as Index_Name,Col.Name as Co_Name from sys.indexes ind 
            inner join sys.tables tab on ind.Object_id = tab.object_id and ind.type in (1,2)/*索引的类型:0=堆/1=聚集/2=非聚集/3=XML*/
            inner join sys.index_columns index_columns on tab.object_id = index_columns.object_id and ind.index_id = index_columns.index_id
            inner join sys.columns Col on tab.object_id = Col.object_id and index_columns.column_id = Col.column_id
        ) t where Tab_Name=tb.Tab_Name and Index_Name=tb.Index_Name  for xml path('')), 1, 1, '')
        from (
            select tab.Name as Tab_Name,ind.Name as Index_Name,Col.Name as Co_Name from sys.indexes ind 
            inner join sys.tables tab on ind.Object_id = tab.object_id and ind.type in (1,2)/*索引的类型:0=堆/1=聚集/2=非聚集/3=XML*/
            inner join sys.index_columns index_columns on tab.object_id = index_columns.object_id and ind.index_id = index_columns.index_id
            inner join sys.columns Col on tab.object_id = Col.object_id and index_columns.column_id = Col.column_id
        )tb
        where Tab_Name not like 'sys%'
        group by Tab_Name,Index_Name
    ) indexs inner join sys.indexes  Ind_Attribute on indexs.Index_Name = Ind_Attribute.name
    order by indexs.Tab_Name
    就是这段代码
      

  10.   

    --查询所有索引
    select    indexs.Tab_Name  as [表名],indexs.Index_Name as [索引名] ,indexs.[Co_Names] as [索引列],
            Ind_Attribute.is_primary_key as [是否主键],Ind_Attribute.is_unique AS [是否唯一键],
            Ind_Attribute.is_disabled AS [是否禁用]
     from (
        select Tab_Name,Index_Name, [Co_Names]=stuff((select ','+[Co_Name] from 
        (    select tab.Name as Tab_Name,ind.Name as Index_Name,Col.Name as Co_Name from sys.indexes ind 
            inner join sys.tables tab on ind.Object_id = tab.object_id and ind.type in (1,2)/*索引的类型:0=堆/1=聚集/2=非聚集/3=XML*/
            inner join sys.index_columns index_columns on tab.object_id = index_columns.object_id and ind.index_id = index_columns.index_id
            inner join sys.columns Col on tab.object_id = Col.object_id and index_columns.column_id = Col.column_id
        ) t where Tab_Name=tb.Tab_Name and Index_Name=tb.Index_Name  for xml path('')), 1, 1, '')
        from (
            select tab.Name as Tab_Name,ind.Name as Index_Name,Col.Name as Co_Name from sys.indexes ind 
            inner join sys.tables tab on ind.Object_id = tab.object_id and ind.type in (1,2)/*索引的类型:0=堆/1=聚集/2=非聚集/3=XML*/
            inner join sys.index_columns index_columns on tab.object_id = index_columns.object_id and ind.index_id = index_columns.index_id
            inner join sys.columns Col on tab.object_id = Col.object_id and index_columns.column_id = Col.column_id
        )tb
        where Tab_Name not like 'sys%'
        group by Tab_Name,Index_Name
    ) indexs inner join sys.indexes  Ind_Attribute on indexs.Index_Name = Ind_Attribute.name
    order by indexs.Tab_Name
      

  11.   

    重建索引Create index即可,不用考虑还原
      

  12.   

    谢谢各位的帮忙,虽然没有得到我想要的答案,仍然谢谢各位了。下面是我自己写的在 sql 2000 中运行得到索引相关信息的脚本,还望大家指点:select a.name as index_name, b.name as table_name,d.name as column_name ,c.keyno ,
    clust =  indexproperty(b.id,a.name,'IsClustered') ,[unique] =  indexproperty(b.id,a.name,'IsUnique') 
    from sysindexes a ,sysobjects b ,sysindexkeys c,syscolumns d
    where  a.indid > 0 and a.indid < 255 and (a.status & 64)=0   and a.id=b.id  and a.id=c.id and 
    a.id=d.id and c.colid=d.colid and a.indid=c.indid and  (OBJECTPROPERTY(b.id, 'IsUserTable') = 1) 
    and b.name <> 'dtproperties'
    order by b.name,c.keyno
      

  13.   

    INDEXKEY_PROPERTY用这个可以解决,我刚怎么就没想到呢?