la fonction INDEXKEY_PROPERTY avec l'option IsDescending ne semble pas
fonctionner correctement...
SQL 2000 SP 4 :
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86)
May 3 2005 23:18:38
Copyright (c) 1988-2003 Microsoft Corporation
Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 2)
Démonstration :
La vue ci dessous est destinée à renseigner sur les composantes des
index de toutes les tables du catalogue :
*******************
CREATE VIEW dbo.V_A_INDEX_DETAILS_IXD
AS
SELECT DISTINCT TOP 100 PERCENT WITH TIES
u.name AS IXD_SCHEMA_NAME,
o.name AS IXD_TABLE_NAME,
i.name AS IXD_INDEX_NAME,
CONSTRAINT_TYPE AS IXD_CONSTRAINT_TYPE,
CASE
WHEN i.indid = 0 THEN 'TABLE'
WHEN i.indid = 1 THEN 'CLUSTER'
WHEN i.indid BETWEEN 2 AND 254 THEN 'HEAP'
WHEN i.indid = 255 THEN 'TXTEIMAGE'
END AS IXD_INDEX_TYPE,
INDEXPROPERTY(o.id, i.name, 'IsUnique') AS IXD_IS_UNIQUE,
INDEXPROPERTY(o.id, i.name, 'IndexFillFactor') AS IXD_FILL_FACTOR,
c.name AS IXD_COL_NAME,
DATA_TYPE + '('+
CAST(COALESCE(CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION) AS
VARCHAR(16))
+ COALESCE(', '+CAST(NULLIF(NUMERIC_SCALE, 0) AS
VARCHAR(16)) , '') +')' AS IXD_COL_TYPE,
k.keyno AS IXD_COL_IDX_ORDER,
CASE
WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.colid ,
'isdescending' ) = 0 THEN 'ASC'
WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.colid ,
'isdescending' ) = 1 THEN 'DESC'
WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.colid ,
'isdescending' ) IS NULL THEN ''
END AS IXD_COL_DATA_ORDER,
INDEXPROPERTY(o.id, i.name, 'IsRowLockDisallowed') AS
IXD_ROW_LOCK_DISALLOWED,
INDEXPROPERTY(o.id, i.name, 'IsPageLockDisallowed') AS
IXD_PAGE_LOCK_DISALLOWED
FROM dbo.sysindexes i
INNER JOIN dbo.sysobjects o
ON i.id = o.id
INNER JOIN dbo.sysusers u
ON o.uid = u.uid
INNER JOIN dbo.sysindexkeys k
ON o.id = k.id
and i.indid = k.indid
INNER JOIN dbo.syscolumns c
ON k.colid = c.colid
and o.id = c.id
INNER JOIN INFORMATION_SCHEMA.COLUMNS ISC
ON u.name = ISC.TABLE_SCHEMA
AND o.name = ISC.TABLE_NAME
AND c.name = ISC.COLUMN_NAME
LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TCT
ON u.name = TCT.CONSTRAINT_SCHEMA
AND i.name = TCT.CONSTRAINT_NAME
WHERE i.status & 64 <> 64 -- sauf les index "stat"
ORDER BY IXD_SCHEMA_NAME, IXD_TABLE_NAME, IXD_INDEX_NAME, IXD_COL_IDX_ORDER
*******************
Or son exécution sur la table constituée ainsi :
CREATE TABLE T_COL (C1 INT not null, C2 INT, C3 INT, C4 INT, C5 INT, C6 INT)
GO
ALTER TABLE T_COL
ADD CONSTRAINT PK_COL PRIMARY KEY NONCLUSTERED (C1)
GO
ALTER TABLE T_COL
ADD CONSTRAINT UK_COL UNIQUE (C2)
GO
SELECT *
FROM V_A_INDEX_DETAILS_IXD
WHERE IXD_SCHEMA_NAME = 'dbo'
AND IXD_TABLE_NAME = 'T_COL'
En particulier la colonne C2 de l'index X_2 apparaît en ASC alors
qu'elle a été crée dans l'index en DESC !
Alors qu'à l'aide de sp_helpindex cette colonne apparaît bien avec '(-)'
Quelqu'un a t'il des info là dessus ???
A +
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Christian Robert
Cela fonctionne correctemennt sur un SQL 2005 :
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
J'ai testé sur un champ en changeant l'ordre de tri de l'index... Il est bien pris en compte par la fonction...
J'ai testé le code sur le même serveur et j'ai le même symptome... Cependant quand je modifie l'odre de tri de C3 sur l'index X_2 j'ai bien C2 qui apparait avec DESC... Et C3... rien...
Par ailleurs UK_COL n'a pas d'ordre indiqué alors qu'il est ASC dans les propriétés de l'index
Visiblement la requête à un petit soucis...
-- Cordialement
Christian Robert Consultant - Formateur chez Winwise MCT - MCDBA - MCSD
"SQLpro [MVP]" a écrit :
Bonjour,
la fonction INDEXKEY_PROPERTY avec l'option IsDescending ne semble pas fonctionner correctement...
SQL 2000 SP 4 : Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 2)
Démonstration :
La vue ci dessous est destinée à renseigner sur les composantes des index de toutes les tables du catalogue :
*******************
CREATE VIEW dbo.V_A_INDEX_DETAILS_IXD AS
SELECT DISTINCT TOP 100 PERCENT WITH TIES u.name AS IXD_SCHEMA_NAME, o.name AS IXD_TABLE_NAME, i.name AS IXD_INDEX_NAME, CONSTRAINT_TYPE AS IXD_CONSTRAINT_TYPE, CASE WHEN i.indid = 0 THEN 'TABLE' WHEN i.indid = 1 THEN 'CLUSTER' WHEN i.indid BETWEEN 2 AND 254 THEN 'HEAP' WHEN i.indid = 255 THEN 'TXTEIMAGE' END AS IXD_INDEX_TYPE, INDEXPROPERTY(o.id, i.name, 'IsUnique') AS IXD_IS_UNIQUE, INDEXPROPERTY(o.id, i.name, 'IndexFillFactor') AS IXD_FILL_FACTOR, c.name AS IXD_COL_NAME, DATA_TYPE + '('+ CAST(COALESCE(CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION) AS VARCHAR(16)) + COALESCE(', '+CAST(NULLIF(NUMERIC_SCALE, 0) AS VARCHAR(16)) , '') +')' AS IXD_COL_TYPE, k.keyno AS IXD_COL_IDX_ORDER, CASE WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.colid , 'isdescending' ) = 0 THEN 'ASC' WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.colid , 'isdescending' ) = 1 THEN 'DESC' WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.colid , 'isdescending' ) IS NULL THEN '' END AS IXD_COL_DATA_ORDER, INDEXPROPERTY(o.id, i.name, 'IsRowLockDisallowed') AS IXD_ROW_LOCK_DISALLOWED, INDEXPROPERTY(o.id, i.name, 'IsPageLockDisallowed') AS IXD_PAGE_LOCK_DISALLOWED
FROM dbo.sysindexes i INNER JOIN dbo.sysobjects o ON i.id = o.id INNER JOIN dbo.sysusers u ON o.uid = u.uid INNER JOIN dbo.sysindexkeys k ON o.id = k.id and i.indid = k.indid INNER JOIN dbo.syscolumns c ON k.colid = c.colid and o.id = c.id INNER JOIN INFORMATION_SCHEMA.COLUMNS ISC ON u.name = ISC.TABLE_SCHEMA AND o.name = ISC.TABLE_NAME AND c.name = ISC.COLUMN_NAME LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TCT ON u.name = TCT.CONSTRAINT_SCHEMA AND i.name = TCT.CONSTRAINT_NAME
WHERE i.status & 64 <> 64 -- sauf les index "stat"
ORDER BY IXD_SCHEMA_NAME, IXD_TABLE_NAME, IXD_INDEX_NAME, IXD_COL_IDX_ORDER
*******************
Or son exécution sur la table constituée ainsi :
CREATE TABLE T_COL (C1 INT not null, C2 INT, C3 INT, C4 INT, C5 INT, C6 INT) GO
ALTER TABLE T_COL ADD CONSTRAINT PK_COL PRIMARY KEY NONCLUSTERED (C1) GO
ALTER TABLE T_COL ADD CONSTRAINT UK_COL UNIQUE (C2) GO
SELECT * FROM V_A_INDEX_DETAILS_IXD WHERE IXD_SCHEMA_NAME = 'dbo' AND IXD_TABLE_NAME = 'T_COL'
En particulier la colonne C2 de l'index X_2 apparaît en ASC alors qu'elle a été crée dans l'index en DESC !
Alors qu'à l'aide de sp_helpindex cette colonne apparaît bien avec '(-)'
Quelqu'un a t'il des info là dessus ???
A +
-- Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com Audit, conseil, expertise, formation, modélisation, tuning, optimisation ********************* http://www.datasapiens.com ***********************
Cela fonctionne correctemennt sur un SQL 2005 :
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37
Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows
NT 5.2 (Build 3790: Service Pack 1)
J'ai testé sur un champ en changeant l'ordre de tri de l'index... Il est
bien pris en compte par la fonction...
J'ai testé le code sur le même serveur et j'ai le même symptome... Cependant
quand je modifie l'odre de tri de C3 sur l'index X_2 j'ai bien C2 qui
apparait avec DESC... Et C3... rien...
Par ailleurs UK_COL n'a pas d'ordre indiqué alors qu'il est ASC dans les
propriétés de l'index
Visiblement la requête à un petit soucis...
--
Cordialement
Christian Robert
Consultant - Formateur chez Winwise
MCT - MCDBA - MCSD
"SQLpro [MVP]" a écrit :
Bonjour,
la fonction INDEXKEY_PROPERTY avec l'option IsDescending ne semble pas
fonctionner correctement...
SQL 2000 SP 4 :
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86)
May 3 2005 23:18:38
Copyright (c) 1988-2003 Microsoft Corporation
Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 2)
Démonstration :
La vue ci dessous est destinée à renseigner sur les composantes des
index de toutes les tables du catalogue :
*******************
CREATE VIEW dbo.V_A_INDEX_DETAILS_IXD
AS
SELECT DISTINCT TOP 100 PERCENT WITH TIES
u.name AS IXD_SCHEMA_NAME,
o.name AS IXD_TABLE_NAME,
i.name AS IXD_INDEX_NAME,
CONSTRAINT_TYPE AS IXD_CONSTRAINT_TYPE,
CASE
WHEN i.indid = 0 THEN 'TABLE'
WHEN i.indid = 1 THEN 'CLUSTER'
WHEN i.indid BETWEEN 2 AND 254 THEN 'HEAP'
WHEN i.indid = 255 THEN 'TXTEIMAGE'
END AS IXD_INDEX_TYPE,
INDEXPROPERTY(o.id, i.name, 'IsUnique') AS IXD_IS_UNIQUE,
INDEXPROPERTY(o.id, i.name, 'IndexFillFactor') AS IXD_FILL_FACTOR,
c.name AS IXD_COL_NAME,
DATA_TYPE + '('+
CAST(COALESCE(CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION) AS
VARCHAR(16))
+ COALESCE(', '+CAST(NULLIF(NUMERIC_SCALE, 0) AS
VARCHAR(16)) , '') +')' AS IXD_COL_TYPE,
k.keyno AS IXD_COL_IDX_ORDER,
CASE
WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.colid ,
'isdescending' ) = 0 THEN 'ASC'
WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.colid ,
'isdescending' ) = 1 THEN 'DESC'
WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.colid ,
'isdescending' ) IS NULL THEN ''
END AS IXD_COL_DATA_ORDER,
INDEXPROPERTY(o.id, i.name, 'IsRowLockDisallowed') AS
IXD_ROW_LOCK_DISALLOWED,
INDEXPROPERTY(o.id, i.name, 'IsPageLockDisallowed') AS
IXD_PAGE_LOCK_DISALLOWED
FROM dbo.sysindexes i
INNER JOIN dbo.sysobjects o
ON i.id = o.id
INNER JOIN dbo.sysusers u
ON o.uid = u.uid
INNER JOIN dbo.sysindexkeys k
ON o.id = k.id
and i.indid = k.indid
INNER JOIN dbo.syscolumns c
ON k.colid = c.colid
and o.id = c.id
INNER JOIN INFORMATION_SCHEMA.COLUMNS ISC
ON u.name = ISC.TABLE_SCHEMA
AND o.name = ISC.TABLE_NAME
AND c.name = ISC.COLUMN_NAME
LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TCT
ON u.name = TCT.CONSTRAINT_SCHEMA
AND i.name = TCT.CONSTRAINT_NAME
WHERE i.status & 64 <> 64 -- sauf les index "stat"
ORDER BY IXD_SCHEMA_NAME, IXD_TABLE_NAME, IXD_INDEX_NAME, IXD_COL_IDX_ORDER
*******************
Or son exécution sur la table constituée ainsi :
CREATE TABLE T_COL (C1 INT not null, C2 INT, C3 INT, C4 INT, C5 INT, C6 INT)
GO
ALTER TABLE T_COL
ADD CONSTRAINT PK_COL PRIMARY KEY NONCLUSTERED (C1)
GO
ALTER TABLE T_COL
ADD CONSTRAINT UK_COL UNIQUE (C2)
GO
SELECT *
FROM V_A_INDEX_DETAILS_IXD
WHERE IXD_SCHEMA_NAME = 'dbo'
AND IXD_TABLE_NAME = 'T_COL'
En particulier la colonne C2 de l'index X_2 apparaît en ASC alors
qu'elle a été crée dans l'index en DESC !
Alors qu'à l'aide de sp_helpindex cette colonne apparaît bien avec '(-)'
Quelqu'un a t'il des info là dessus ???
A +
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
J'ai testé sur un champ en changeant l'ordre de tri de l'index... Il est bien pris en compte par la fonction...
J'ai testé le code sur le même serveur et j'ai le même symptome... Cependant quand je modifie l'odre de tri de C3 sur l'index X_2 j'ai bien C2 qui apparait avec DESC... Et C3... rien...
Par ailleurs UK_COL n'a pas d'ordre indiqué alors qu'il est ASC dans les propriétés de l'index
Visiblement la requête à un petit soucis...
-- Cordialement
Christian Robert Consultant - Formateur chez Winwise MCT - MCDBA - MCSD
"SQLpro [MVP]" a écrit :
Bonjour,
la fonction INDEXKEY_PROPERTY avec l'option IsDescending ne semble pas fonctionner correctement...
SQL 2000 SP 4 : Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 2)
Démonstration :
La vue ci dessous est destinée à renseigner sur les composantes des index de toutes les tables du catalogue :
*******************
CREATE VIEW dbo.V_A_INDEX_DETAILS_IXD AS
SELECT DISTINCT TOP 100 PERCENT WITH TIES u.name AS IXD_SCHEMA_NAME, o.name AS IXD_TABLE_NAME, i.name AS IXD_INDEX_NAME, CONSTRAINT_TYPE AS IXD_CONSTRAINT_TYPE, CASE WHEN i.indid = 0 THEN 'TABLE' WHEN i.indid = 1 THEN 'CLUSTER' WHEN i.indid BETWEEN 2 AND 254 THEN 'HEAP' WHEN i.indid = 255 THEN 'TXTEIMAGE' END AS IXD_INDEX_TYPE, INDEXPROPERTY(o.id, i.name, 'IsUnique') AS IXD_IS_UNIQUE, INDEXPROPERTY(o.id, i.name, 'IndexFillFactor') AS IXD_FILL_FACTOR, c.name AS IXD_COL_NAME, DATA_TYPE + '('+ CAST(COALESCE(CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION) AS VARCHAR(16)) + COALESCE(', '+CAST(NULLIF(NUMERIC_SCALE, 0) AS VARCHAR(16)) , '') +')' AS IXD_COL_TYPE, k.keyno AS IXD_COL_IDX_ORDER, CASE WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.colid , 'isdescending' ) = 0 THEN 'ASC' WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.colid , 'isdescending' ) = 1 THEN 'DESC' WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.colid , 'isdescending' ) IS NULL THEN '' END AS IXD_COL_DATA_ORDER, INDEXPROPERTY(o.id, i.name, 'IsRowLockDisallowed') AS IXD_ROW_LOCK_DISALLOWED, INDEXPROPERTY(o.id, i.name, 'IsPageLockDisallowed') AS IXD_PAGE_LOCK_DISALLOWED
FROM dbo.sysindexes i INNER JOIN dbo.sysobjects o ON i.id = o.id INNER JOIN dbo.sysusers u ON o.uid = u.uid INNER JOIN dbo.sysindexkeys k ON o.id = k.id and i.indid = k.indid INNER JOIN dbo.syscolumns c ON k.colid = c.colid and o.id = c.id INNER JOIN INFORMATION_SCHEMA.COLUMNS ISC ON u.name = ISC.TABLE_SCHEMA AND o.name = ISC.TABLE_NAME AND c.name = ISC.COLUMN_NAME LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TCT ON u.name = TCT.CONSTRAINT_SCHEMA AND i.name = TCT.CONSTRAINT_NAME
WHERE i.status & 64 <> 64 -- sauf les index "stat"
ORDER BY IXD_SCHEMA_NAME, IXD_TABLE_NAME, IXD_INDEX_NAME, IXD_COL_IDX_ORDER
*******************
Or son exécution sur la table constituée ainsi :
CREATE TABLE T_COL (C1 INT not null, C2 INT, C3 INT, C4 INT, C5 INT, C6 INT) GO
ALTER TABLE T_COL ADD CONSTRAINT PK_COL PRIMARY KEY NONCLUSTERED (C1) GO
ALTER TABLE T_COL ADD CONSTRAINT UK_COL UNIQUE (C2) GO
SELECT * FROM V_A_INDEX_DETAILS_IXD WHERE IXD_SCHEMA_NAME = 'dbo' AND IXD_TABLE_NAME = 'T_COL'
En particulier la colonne C2 de l'index X_2 apparaît en ASC alors qu'elle a été crée dans l'index en DESC !
Alors qu'à l'aide de sp_helpindex cette colonne apparaît bien avec '(-)'
Quelqu'un a t'il des info là dessus ???
A +
-- Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com Audit, conseil, expertise, formation, modélisation, tuning, optimisation ********************* http://www.datasapiens.com ***********************
SQLpro [MVP]
Christian Robert a écrit :
Cela fonctionne correctemennt sur un SQL 2005 :
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
J'ai testé sur un champ en changeant l'ordre de tri de l'index... Il est bien pris en compte par la fonction...
J'ai testé le code sur le même serveur et j'ai le même symptome... Cependant quand je modifie l'odre de tri de C3 sur l'index X_2 j'ai bien C2 qui apparait avec DESC... Et C3... rien...
Par ailleurs UK_COL n'a pas d'ordre indiqué alors qu'il est ASC dans les propriétés de l'index
Visiblement la requête à un petit soucis...
ayant posté dans le forum US j'ai obtenu une solution :
CREATE VIEW dbo.V_A_INDEX_DETAILS_IXD AS
SELECT DISTINCT TOP 100 PERCENT WITH TIES u.name AS IXD_SCHEMA_NAME, o.name AS IXD_TABLE_NAME, i.name AS IXD_INDEX_NAME, CONSTRAINT_TYPE AS IXD_CONSTRAINT_TYPE, CASE WHEN i.indid = 0 THEN 'TABLE' WHEN i.indid = 1 THEN 'CLUSTER' WHEN i.indid BETWEEN 2 AND 254 THEN 'HEAP' WHEN i.indid = 255 THEN 'TXTEIMAGE' END AS IXD_INDEX_TYPE, INDEXPROPERTY(o.id, i.name, 'IsUnique') AS IXD_IS_UNIQUE, INDEXPROPERTY(o.id, i.name, 'IndexFillFactor') AS IXD_FILL_FACTOR, c.name AS IXD_COL_NAME, DATA_TYPE + '('+ CAST(COALESCE(CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION) AS VARCHAR(16)) + COALESCE(', '+CAST(NULLIF(NUMERIC_SCALE, 0) AS VARCHAR(16)) , '') +')' AS IXD_COL_TYPE, k.keyno AS IXD_COL_IDX_ORDER, CASE /* l'erreur est là : colid à la place de keyno !!! */ WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.keyno , 'isdescending' ) = 0 THEN 'ASC' WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.keyno , 'isdescending' ) = 1 THEN 'DESC' WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.keyno , 'isdescending' ) IS NULL THEN '' /* fin de l'erreur : colid à la place de keyno !!! */ END AS IXD_COL_DATA_ORDER, INDEXPROPERTY(o.id, i.name, 'IsRowLockDisallowed') AS IXD_ROW_LOCK_DISALLOWED, INDEXPROPERTY(o.id, i.name, 'IsPageLockDisallowed') AS IXD_PAGE_LOCK_DISALLOWED
FROM dbo.sysindexes i INNER JOIN dbo.sysobjects o ON i.id = o.id INNER JOIN dbo.sysusers u ON o.uid = u.uid INNER JOIN dbo.sysindexkeys k ON o.id = k.id and i.indid = k.indid INNER JOIN dbo.syscolumns c ON k.colid = c.colid and o.id = c.id INNER JOIN INFORMATION_SCHEMA.COLUMNS ISC ON u.name = ISC.TABLE_SCHEMA AND o.name = ISC.TABLE_NAME AND c.name = ISC.COLUMN_NAME LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TCT ON u.name = TCT.CONSTRAINT_SCHEMA AND i.name = TCT.CONSTRAINT_NAME
WHERE i.status & 64 <> 64 -- sauf les index "stat"
ORDER BY IXD_SCHEMA_NAME, IXD_TABLE_NAME, IXD_INDEX_NAME, IXD_COL_IDX_ORDER
-- Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com Audit, conseil, expertise, formation, modélisation, tuning, optimisation ********************* http://www.datasapiens.com ***********************
Christian Robert a écrit :
Cela fonctionne correctemennt sur un SQL 2005 :
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37
Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows
NT 5.2 (Build 3790: Service Pack 1)
J'ai testé sur un champ en changeant l'ordre de tri de l'index... Il est
bien pris en compte par la fonction...
J'ai testé le code sur le même serveur et j'ai le même symptome... Cependant
quand je modifie l'odre de tri de C3 sur l'index X_2 j'ai bien C2 qui
apparait avec DESC... Et C3... rien...
Par ailleurs UK_COL n'a pas d'ordre indiqué alors qu'il est ASC dans les
propriétés de l'index
Visiblement la requête à un petit soucis...
ayant posté dans le forum US j'ai obtenu une solution :
CREATE VIEW dbo.V_A_INDEX_DETAILS_IXD
AS
SELECT DISTINCT TOP 100 PERCENT WITH TIES
u.name AS IXD_SCHEMA_NAME,
o.name AS IXD_TABLE_NAME,
i.name AS IXD_INDEX_NAME,
CONSTRAINT_TYPE AS IXD_CONSTRAINT_TYPE,
CASE
WHEN i.indid = 0 THEN 'TABLE'
WHEN i.indid = 1 THEN 'CLUSTER'
WHEN i.indid BETWEEN 2 AND 254 THEN 'HEAP'
WHEN i.indid = 255 THEN 'TXTEIMAGE'
END AS IXD_INDEX_TYPE,
INDEXPROPERTY(o.id, i.name, 'IsUnique') AS IXD_IS_UNIQUE,
INDEXPROPERTY(o.id, i.name, 'IndexFillFactor') AS IXD_FILL_FACTOR,
c.name AS IXD_COL_NAME,
DATA_TYPE + '('+
CAST(COALESCE(CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION) AS
VARCHAR(16))
+ COALESCE(', '+CAST(NULLIF(NUMERIC_SCALE, 0) AS
VARCHAR(16)) , '') +')' AS IXD_COL_TYPE,
k.keyno AS IXD_COL_IDX_ORDER,
CASE
/* l'erreur est là : colid à la place de keyno !!! */
WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.keyno ,
'isdescending' ) = 0 THEN 'ASC'
WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.keyno ,
'isdescending' ) = 1 THEN 'DESC'
WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.keyno ,
'isdescending' ) IS NULL THEN ''
/* fin de l'erreur : colid à la place de keyno !!! */
END AS IXD_COL_DATA_ORDER,
INDEXPROPERTY(o.id, i.name, 'IsRowLockDisallowed') AS
IXD_ROW_LOCK_DISALLOWED,
INDEXPROPERTY(o.id, i.name, 'IsPageLockDisallowed') AS
IXD_PAGE_LOCK_DISALLOWED
FROM dbo.sysindexes i
INNER JOIN dbo.sysobjects o
ON i.id = o.id
INNER JOIN dbo.sysusers u
ON o.uid = u.uid
INNER JOIN dbo.sysindexkeys k
ON o.id = k.id
and i.indid = k.indid
INNER JOIN dbo.syscolumns c
ON k.colid = c.colid
and o.id = c.id
INNER JOIN INFORMATION_SCHEMA.COLUMNS ISC
ON u.name = ISC.TABLE_SCHEMA
AND o.name = ISC.TABLE_NAME
AND c.name = ISC.COLUMN_NAME
LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TCT
ON u.name = TCT.CONSTRAINT_SCHEMA
AND i.name = TCT.CONSTRAINT_NAME
WHERE i.status & 64 <> 64 -- sauf les index "stat"
ORDER BY IXD_SCHEMA_NAME, IXD_TABLE_NAME, IXD_INDEX_NAME,
IXD_COL_IDX_ORDER
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
J'ai testé sur un champ en changeant l'ordre de tri de l'index... Il est bien pris en compte par la fonction...
J'ai testé le code sur le même serveur et j'ai le même symptome... Cependant quand je modifie l'odre de tri de C3 sur l'index X_2 j'ai bien C2 qui apparait avec DESC... Et C3... rien...
Par ailleurs UK_COL n'a pas d'ordre indiqué alors qu'il est ASC dans les propriétés de l'index
Visiblement la requête à un petit soucis...
ayant posté dans le forum US j'ai obtenu une solution :
CREATE VIEW dbo.V_A_INDEX_DETAILS_IXD AS
SELECT DISTINCT TOP 100 PERCENT WITH TIES u.name AS IXD_SCHEMA_NAME, o.name AS IXD_TABLE_NAME, i.name AS IXD_INDEX_NAME, CONSTRAINT_TYPE AS IXD_CONSTRAINT_TYPE, CASE WHEN i.indid = 0 THEN 'TABLE' WHEN i.indid = 1 THEN 'CLUSTER' WHEN i.indid BETWEEN 2 AND 254 THEN 'HEAP' WHEN i.indid = 255 THEN 'TXTEIMAGE' END AS IXD_INDEX_TYPE, INDEXPROPERTY(o.id, i.name, 'IsUnique') AS IXD_IS_UNIQUE, INDEXPROPERTY(o.id, i.name, 'IndexFillFactor') AS IXD_FILL_FACTOR, c.name AS IXD_COL_NAME, DATA_TYPE + '('+ CAST(COALESCE(CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION) AS VARCHAR(16)) + COALESCE(', '+CAST(NULLIF(NUMERIC_SCALE, 0) AS VARCHAR(16)) , '') +')' AS IXD_COL_TYPE, k.keyno AS IXD_COL_IDX_ORDER, CASE /* l'erreur est là : colid à la place de keyno !!! */ WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.keyno , 'isdescending' ) = 0 THEN 'ASC' WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.keyno , 'isdescending' ) = 1 THEN 'DESC' WHEN INDEXKEY_PROPERTY (o.id , i.indid , k.keyno , 'isdescending' ) IS NULL THEN '' /* fin de l'erreur : colid à la place de keyno !!! */ END AS IXD_COL_DATA_ORDER, INDEXPROPERTY(o.id, i.name, 'IsRowLockDisallowed') AS IXD_ROW_LOCK_DISALLOWED, INDEXPROPERTY(o.id, i.name, 'IsPageLockDisallowed') AS IXD_PAGE_LOCK_DISALLOWED
FROM dbo.sysindexes i INNER JOIN dbo.sysobjects o ON i.id = o.id INNER JOIN dbo.sysusers u ON o.uid = u.uid INNER JOIN dbo.sysindexkeys k ON o.id = k.id and i.indid = k.indid INNER JOIN dbo.syscolumns c ON k.colid = c.colid and o.id = c.id INNER JOIN INFORMATION_SCHEMA.COLUMNS ISC ON u.name = ISC.TABLE_SCHEMA AND o.name = ISC.TABLE_NAME AND c.name = ISC.COLUMN_NAME LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TCT ON u.name = TCT.CONSTRAINT_SCHEMA AND i.name = TCT.CONSTRAINT_NAME
WHERE i.status & 64 <> 64 -- sauf les index "stat"
ORDER BY IXD_SCHEMA_NAME, IXD_TABLE_NAME, IXD_INDEX_NAME, IXD_COL_IDX_ORDER
-- Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com Audit, conseil, expertise, formation, modélisation, tuning, optimisation ********************* http://www.datasapiens.com ***********************