Denne SQL giver dig tabelnavn og indeksnavn for de indeks, der er oprettet
select so.[Name] as Table_Name, SI.[Name] as Index_Name from SysIndexes SI inner join SysObjects SO on SI.[ID] = SO.[ID] where (SO.[Type]='U') and (SI.IndID not in (0, 255))
Det ved jeg heller ikke helt præcist. Jeg har bygget det ud fra oplysninger i en dokumentation over SQL Serverens System-tabeller, som jeg har fået fat i.
Den her giver dig de index, der er defineret via Create Index med de tilhørende feltet (en post per felt i index, sorteret efter feltets position i indekset)
select so.[Name] as Table_Name, SI.[Name] as Index_Name, sik.* from ( SysIndexes SI inner join ( select top 100 percent sik2.[id], sik2.indid, sc2.[name] from sysindexkeys sik2 inner join syscolumns sc2 on sik2.[id] = sc2.[id] and sik2.colid = sc2.colid order by sik2.indid, sik2.keyno ) sik on si.[id] = sik.[id] and si.indid = sik.indid ) inner join SysObjects SO on SI.[ID] = SO.[ID] where (SO.[Type]='U') and (SI.IndID not in (0, 255))
Jeg har desværre ikke nogen query-analyser. Hvis primary key ikke er index men table constraint, hvorfor viser din første sql så at der index i en tilfældig tabel, når der kun er primary keys og almindelige attributter ?
benny-tordrup: jeg har nu testet dine query's på min egen sql2000 server, og har virker de begge. Problemet er bare at det er til et skoleprojekt som skal kunne køre på skolen materiel, og de har kun sql 6.5.
Men hvis du kan finde en løsning som kan virke på sql 6.5, er jeg villig til at give det dobbelte antal point.
SELECT i.name AS CONSTRAINT_NAME, t_obj.name AS TABLE_NAME, col.name AS COLUMN_NAME, c_obj.xtype as KEY_TYPE FROM sysobjects c_obj, sysobjects t_obj, syscolumns col, master.dbo.spt_values v, sysindexes i WHERE c_obj.xtype IN ("UQ", "PK") And t_obj.id = c_obj.parent_obj AND t_obj.xtype = "U" AND t_obj.id = col.id AND col.name = index_col(t_obj.name, i.indid, v.number) AND t_obj.id = i.id AND c_obj.name = i.name AND v.number > 0 AND v.number <= i.keycnt AND v.type = "P"
Den virker i min SQL 6.5 og returnerer: ConstraintName, TableName, ColumnName, Key_Type. Jeg har lavet den for en tid siden så jeg kan ikke huske alle detaljerne, men den skulle få dig minst halvejs til målet :)
Okay, jeg har nu selv fundet en løsning. Først for constraints, som returnere navnet på constraintstypen, hvis der er nogen eller null.
"+aid+" er attributtens id og '"+tabel+"' navnet på tabellen som attributten er på. De bliver i dette tilfælde leveret fra en jsp-side.
SELECT sysconstraints.status
FROM sysconstraints, sysobjects, syscolumns, syscomments, attributKommentar, systypes
where syscolumns.colid = "+aid+" and sysobjects.name = '"+tabel+"' and sysobjects.id=syscolumns.id and systypes.usertype = syscolumns.usertype and sysobjects.type = 'u' and tabelId = sysobjects.id and aId = syscolumns.colid and sysconstraints.id = sysobjects.id and syscolumns.colid = sysconstraints.colid and sysconstraints.constid =syscomments.id
Endelige fandt jeg queryen der kan hente index. Det vil sige næsten, den virker ikke på alle typer af constraints, jeg kan ikke lige huske hvilken.
SELECT syscolumns.name FROM syscolumns, sysindexes, sysobjects WHERE sysobjects.id = syscolumns.id AND syscolumns.id = sysindexes.id AND convert(int,convert(varbinary(3),sysindexes.keys1))%256= syscolumns.colid AND syscolumns.name = '"+attribut+"' AND sysobjects.name = '"+tabel+"'"
"+attribut+" erstattes med den aktuelle attribut og "+tabel+" med den aktuelle tabel.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.