Monday, March 12, 2012

Help! Create index with substring

Good day!

We had decided to migrate from Oracle to SQL Server, so faced some problems. Using Oracle we could create indexes like that

create index obj_id_cnum on obj_id (substr(cnum,1,2))

But Microsoft SQL Server doesn't allow this code. How can we do the same using SQL Server. Thanks you.

dynamic sql...

declare @.SQL nvarchar(100)

set @.SQL = 'create index [obj_id_cnum] on object_id(' + substring(cnum,1,2) + ')'

exec sp_executesql @.SQL

|||

Is obj_id a table, I am assuming? If so, then you are right, you cannot apply an index on a function directly. Two ways you can approach this:

1. If using enterprise edition, you can index a view and it will be used:

create view obj_id_indexed
as
select obj_id_key, cnum, substring(cnum,1,2) as cnumSub,
from obj_id

create unique clustered index on obj_id_cnum(obj_id_key, cnumSub)

Now your queries will see this index on the the view and apply it just like the

2. You can however add a computed column to your table and then index it:

alter table obj_id
add cnumSub as substring(cnum,1,2)

I would suggest that all of these techniques are probably the "wrong" way to go about this sort of thing. Almost any time you need to use a substring on a value in a SQL table there is a problem with normalization. Better would be to break the column into two parts, and then you have a much better chance of making the indexes work for you.

|||Thanks you very much! I do appreciate your help!|||

Derek Comingore - RSC wrote:

dynamic sql...

declare @.SQL nvarchar(100)

set @.SQL = 'create index [obj_id_cnum] on object_id(' + substring(cnum,1,2) + ')'

exec sp_executesql @.SQL

set @.SQL = 'create index [obj_id_cnum] on object_id(' + substring(cnum,1,2) + ')' gives an error 'Invalid column name 'cnum'.

|||Note that we are considering adding function / expression based indexes for a future version of SQL Server. For now, the easiest workaround is to use an indexed computed column.

No comments:

Post a Comment