OVH Cloud OVH Cloud

Bug MS SQL Server 2000 ??? INDEXKEY_PROPERTY

2 réponses
Avatar
SQLpro [MVP]
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

CREATE INDEX X_1 ON T_COL (C1, C2 DESC, C3)
GO

CREATE INDEX X_2 ON T_COL (C2 DESC, C3)
GO

CREATE CLUSTERED INDEX X_3 ON T_COL (C3)
go

sp_indexoption '[T_COL].[X_3]', 'DisAllowRowLocks', 1

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

2 réponses

Avatar
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

CREATE INDEX X_1 ON T_COL (C1, C2 DESC, C3)
GO

CREATE INDEX X_2 ON T_COL (C2 DESC, C3)
GO

CREATE CLUSTERED INDEX X_3 ON T_COL (C3)
go

sp_indexoption '[T_COL].[X_3]', 'DisAllowRowLocks', 1

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



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