Bonjour,

J'ai terminé d'écrire une procédure stockée pour la maintenance automatisée des index, et je suis maintenant confronté à un petit problème.

Lorsque la procédure stockée tente de reconstruire un index :

- sur une table qui n'a aucune colonne de type LOB (pas de varchar(max), nvarchar(max), varbinary(max) ou xml)
- qui n'est pas un index filtré
- qui n'est pas sur une colonne calculée (la table n'en a pas)
- qui n'est pas sur une vue indexée
- qui n'est pas sur une colonne spatiale

ALTER INDEX failed because the following SET options have incorrect settings: 'ANSI_WARNINGS'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index operations.
La définition de l'index telle que scriptée par SSMS est la suivante, aux noms de colonne près :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
USE [myDB]
GO
 
/****** Object:  Index [IX_table__b__c__j__k]    Script Date: 03/23/2012 16:05:47 ******/
CREATE NONCLUSTERED INDEX [IX_table__b__c__j__k] ON [dbo].[table] 
(
	[b] ASC,
	[c] ASC,
	[j] ASC,
	[k] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO
L'instruction générée par la procédure stockée est :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
ALTER INDEX [IX_table__b__c__j__k]
ON myDB.dbo.table  REBUILD WITH (ONLINE = ON, FILLFACTOR = 100)
Le type de données des colonnes b, c et j est uniqueidentifier.
La colonne d est une datetime. Au total, la clé fait donc 3 x 16 + 8 = 56 octets.

J'ai supprimé l'index puis je l'ai créé (c'est à dire que je n'ai pas utilisé l'option DROP_EXISTING = ON de CREATE INDEX), mais rien n'y fait.

Le script de la table tel que généré par SSMS, aux noms de colonne près est le suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
USE [myDB]
GO
 
/****** Object:  Table [dbo].[table]    Script Date: 03/23/2012 16:24:47 ******/
SET ANSI_NULLS ON
GO
 
SET QUOTED_IDENTIFIER ON
GO
 
SET ANSI_PADDING ON
GO
 
CREATE TABLE [dbo].[table](
	[a] [bigint] IDENTITY(1,1) NOT NULL,
	[b] [uniqueidentifier] NOT NULL,
	[c] [uniqueidentifier] NOT NULL,
	[d] [int] NOT NULL,
	[e] [uniqueidentifier] NULL,
	[f] [uniqueidentifier] NULL,
	[g] [datetime] NULL,
	[h] [datetime] NULL,
	[i] [int] NOT NULL,
	[j] [uniqueidentifier] NULL,
	[k] [datetime] NULL,
	[l] [int] NULL,
	[m] [varchar](10) NULL,
	[n] [int] NULL,
	[o] [money] NULL,
	[p] [varchar](256) NULL,
	[q] [bit] NOT NULL,
	[r] [int] NOT NULL,
	[s] [bit] NOT NULL,
	[t] [int] NOT NULL,
	[u] [datetime] NOT NULL,
	[v] [uniqueidentifier] NOT NULL,
	[w] [datetime] NULL,
	[x] [uniqueidentifier] NULL,
	[y] [float] NULL,
	[z] [uniqueidentifier] NULL,
 CONSTRAINT [PK_table] PRIMARY KEY CLUSTERED 
(
	[a] ASC
)WITH (PAD_INDEX  = ON, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]
 
GO
Quelqu'un a-t-il une idée ?

@++