EDIT: This stored procedure has been updated.
The below stored procedure runs DBCC INDEXDEFRAG for each of the indexes in the user database that is inputted into the sproc. I recommend putting it into an Admin database (hey just name it Admin!) rather than in master. Then just schedule isp_DBCC_INDEXDEFRAG for each of the databases you want defragged. Remember that DBCC INDEXDEFRAG isn't as good as DBCC DBREINDEX in large scale environments (for more information on this, see this article), so see my DBCC DBREINDEX weblog coming soon. It'll be better than the other one I posted a while back.
CREATE PROC isp_DBCC_INDEXDEFRAG
(@dbName SYSNAME)
AS
SET NOCOUNT ON
DECLARE @objID INT
DECLARE @idxName SYSNAME
DECLARE @SQL NVARCHAR(4000)
SET @objID = 0
SET @SQL = ''
SET @SQL = @SQL + 'SELECT i.id, i.name '
SET @SQL = @SQL + 'INTO ##Indexes '
SET @SQL = @SQL + 'FROM ' + @dbName + '.dbo.sysindexes i '
SET @SQL = @SQL + 'INNER JOIN ' + @dbName + '.dbo.sysobjects o '
SET @SQL = @SQL + 'ON i.id = o.id '
SET @SQL = @SQL + 'WHERE indid > 0 AND indid < 255 AND '
SET @SQL = @SQL + 'o.type = ''U'' AND '
SET @SQL = @SQL + '(i.status & (64 | 8388608)) <= 0'
EXEC sp_executesql @statement = @SQL
WHILE @objID < (SELECT MAX(id) FROM ##Indexes)
BEGIN
SELECT TOP 1 @objID = id, @idxName = name
FROM ##Indexes
WHERE id > @objID
ORDER BY id
SET @SQL = 'DBCC INDEXDEFRAG(' + @dbName + ', ' + CONVERT(VARCHAR(50), @objID) + ', ' + @idxName + ') WITH NO_INFOMSGS'
EXEC sp_executesql @statement = @SQL
END
DROP TABLE ##Indexes
RETURN 0
GO