Re: sysindexes
From: Jacco Schalkwijk (NOSPAMjaccos_at_eurostop.co.uk)
Date: 05/06/04
- Next message: SQLNerdz: "Re: avoid Timeout expired?"
- Previous message: Narayana Vyas Kondreddi: "Re: Recover DB from the expired evaluation copy of SQL 2000 Server"
- In reply to: anonymous_at_discussions.microsoft.com: "Re: sysindexes"
- Next in thread: anonymous_at_discussions.microsoft.com: "Re: sysindexes"
- Reply: anonymous_at_discussions.microsoft.com: "Re: sysindexes"
- Messages sorted by: [ date ] [ thread ]
Date: Thu, 6 May 2004 14:35:48 +0100
See if you can get on from this script. I wrote it to change the column
collation, but you should be able to use it for your column change as well.
It is still a work in progress though, so I can't guarantee it will work
completely.
--
Jacco Schalkwijk
SQL Server MVP
-- Initialisation
DECLARE @sql VARCHAR(4000)
DECLARE @debug BIT
DECLARE @sql_1 VARCHAR(4000)
DECLARE @sql_2 VARCHAR(4000)
DECLARE @sql_3 VARCHAR(4000)
DECLARE @sql_4 VARCHAR(4000)
DECLARE @index_name SYSNAME
DECLARE @constraint_name SYSNAME
DECLARE @table_name SYSNAME
DECLARE @cluster_type VARCHAR(12)
DECLARE @keyno TINYINT
DECLARE @collation SYSNAME
-- Create temporary tables to hold all the information about the object
-- we are going to drop and recreate
SET NOCOUNT OFF
SET @collation = CAST(SERVERPROPERTY('Collation') AS SYSNAME)
Print 'Start'
SET @debug = 1
BEGIN TRAN
CREATE TABLE #COLLATE_COLUMNS(
TABLE_NAME VARCHAR(128) NOT NULL,
COLUMN_NAME VARCHAR(128) NOT NULL,
IS_NULLABLE VARCHAR(3) NOT NULL,
DATA_TYPE VARCHAR(128) NOT NULL,
CHARACTER_MAXIMUM_LENGTH INT,
PRIMARY KEY(TABLE_NAME, COLUMN_NAME))
CREATE TABLE #CHECK_CONSTRAINTS(
CONSTRAINT_NAME VARCHAR(128) NOT NULL,
TABLE_NAME VARCHAR(128) NOT NULL,
CHECK_CLAUSE VARCHAR(4000) NOT NULL
PRIMARY KEY(CONSTRAINT_NAME))
CREATE TABLE #UNIQUE_CONSTRAINTS(
CONSTRAINT_NAME VARCHAR(128) NOT NULL,
TABLE_NAME VARCHAR(128) NOT NULL,
CONSTRAINT_TYPE VARCHAR(11) NOT NULL,
CLUSTER_TYPE VARCHAR(12) NOT NULL,
PRIMARY KEY (CONSTRAINT_NAME, TABLE_NAME))
CREATE TABLE #UNIQUE_CONSTRAINTS_COLUMNS(
CONSTRAINT_NAME VARCHAR(128) NOT NULL,
COLUMN_NAME VARCHAR(128) NOT NULL,
KEYNO TINYINT NOT NULL,
PRIMARY KEY(CONSTRAINT_NAME, COLUMN_NAME))
CREATE TABLE #FOREIGN_KEYS(
CONSTRAINT_NAME VARCHAR(128) NOT NULL,
FK_TABLE_NAME VARCHAR(128) NOT NULL,
PK_TABLE_NAME VARCHAR(128) NOT NULL,
UPDATE_RULE VARCHAR(9) NOT NULL,
DELETE_RULE VARCHAR(9) NOT NULL,
FK_COLUMN_1 VARCHAR(128) NULL,
FK_COLUMN_2 VARCHAR(128) NULL,
FK_COLUMN_3 VARCHAR(128) NULL,
FK_COLUMN_4 VARCHAR(128) NULL,
FK_COLUMN_5 VARCHAR(128) NULL,
FK_COLUMN_6 VARCHAR(128) NULL,
FK_COLUMN_7 VARCHAR(128) NULL,
FK_COLUMN_8 VARCHAR(128) NULL,
FK_COLUMN_9 VARCHAR(128) NULL,
FK_COLUMN_10 VARCHAR(128) NULL,
FK_COLUMN_11 VARCHAR(128) NULL,
FK_COLUMN_12 VARCHAR(128) NULL,
FK_COLUMN_13 VARCHAR(128) NULL,
FK_COLUMN_14 VARCHAR(128) NULL,
FK_COLUMN_15 VARCHAR(128) NULL,
FK_COLUMN_16 VARCHAR(128) NULL,
PK_COLUMN_1 VARCHAR(128) NULL,
PK_COLUMN_2 VARCHAR(128) NULL,
PK_COLUMN_3 VARCHAR(128) NULL,
PK_COLUMN_4 VARCHAR(128) NULL,
PK_COLUMN_5 VARCHAR(128) NULL,
PK_COLUMN_6 VARCHAR(128) NULL,
PK_COLUMN_7 VARCHAR(128) NULL,
PK_COLUMN_8 VARCHAR(128) NULL,
PK_COLUMN_9 VARCHAR(128) NULL,
PK_COLUMN_10 VARCHAR(128) NULL,
PK_COLUMN_11 VARCHAR(128) NULL,
PK_COLUMN_12 VARCHAR(128) NULL,
PK_COLUMN_13 VARCHAR(128) NULL,
PK_COLUMN_14 VARCHAR(128) NULL,
PK_COLUMN_15 VARCHAR(128) NULL,
PK_COLUMN_16 VARCHAR(128) NULL,
PRIMARY KEY (CONSTRAINT_NAME))
CREATE TABLE #COMPUTED_COLUMNS(
TABLE_NAME VARCHAR(128) NOT NULL,
COLUMN_NAME VARCHAR(128) NOT NULL,
FORMULA VARCHAR(4000) NOT NULL,
PRIMARY KEY (TABLE_NAME, COLUMN_NAME))
CREATE TABLE #INDEXES(
INDEX_NAME VARCHAR(128) NOT NULL,
TABLE_NAME VARCHAR(128) NOT NULL,
CLUSTER_TYPE VARCHAR(12) NOT NULL,
PRIMARY KEY (INDEX_NAME, TABLE_NAME))
CREATE TABLE #INDEX_COLUMNS(
INDEX_NAME VARCHAR(128) NOT NULL,
TABLE_NAME VARCHAR(128) NOT NULL,
COLUMN_NAME VARCHAR(128) NOT NULL,
KEYNO TINYINT,
PRIMARY KEY (INDEX_NAME, TABLE_NAME, COLUMN_NAME))
-- Fill the temporary tables with the relevant information _and_ drop
-- the objects.
Print 'Tables created'
INSERT INTO #COLLATE_COLUMNS(
TABLE_NAME,
COLUMN_NAME,
IS_NULLABLE,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH
)
SELECT
c.table_name,
c.column_name,
c.is_nullable,
c.data_type,
c.character_maximum_length
FROM information_schema.columns c
INNER JOIN information_schema.tables t
ON c.table_name = t.table_name
WHERE (c.collation_name <> @collation
AND t.table_type = 'BASE TABLE')
INSERT INTO #CHECK_CONSTRAINTS (
CONSTRAINT_NAME,
TABLE_NAME,
CHECK_CLAUSE
)
SELECT
cc.CONSTRAINT_NAME,
tc.TABLE_NAME,
cc.CHECK_CLAUSE
FROM information_schema.check_constraints cc
INNER JOIN information_schema.table_constraints tc
ON cc.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
WHERE EXISTS(SELECT NULL FROM #COLLATE_COLUMNS col
WHERE tc.TABLE_NAME = col.TABLE_NAME)
Print '#CHECK_CONSTRAINTS filled'
WHILE 1=1
BEGIN
SET @sql = (SELECT TOP 1 'ALTER TABLE ' + QUOTENAME(TABLE_NAME)
+ ' DROP CONSTRAINT ' + QUOTENAME(CONSTRAINT_NAME)
FROM #CHECK_CONSTRAINTS
WHERE EXISTS(SELECT NULL FROM information_schema.table_constraints tc
WHERE tc.constraint_name = #CHECK_CONSTRAINTS.CONSTRAINT_NAME))
IF @sql IS NULL BREAK
IF @debug = 1 PRINT @sql
EXEC (@sql)
END
INSERT INTO #FOREIGN_KEYS(
CONSTRAINT_NAME,
FK_TABLE_NAME,
PK_TABLE_NAME,
UPDATE_RULE,
DELETE_RULE,
FK_COLUMN_1 ,
FK_COLUMN_2 ,
FK_COLUMN_3 ,
FK_COLUMN_4 ,
FK_COLUMN_5 ,
FK_COLUMN_6 ,
FK_COLUMN_7 ,
FK_COLUMN_8 ,
FK_COLUMN_9 ,
FK_COLUMN_10 ,
FK_COLUMN_11 ,
FK_COLUMN_12 ,
FK_COLUMN_13 ,
FK_COLUMN_14 ,
FK_COLUMN_15 ,
FK_COLUMN_16 ,
PK_COLUMN_1 ,
PK_COLUMN_2 ,
PK_COLUMN_3 ,
PK_COLUMN_4 ,
PK_COLUMN_5 ,
PK_COLUMN_6 ,
PK_COLUMN_7 ,
PK_COLUMN_8 ,
PK_COLUMN_9 ,
PK_COLUMN_10 ,
PK_COLUMN_11 ,
PK_COLUMN_12 ,
PK_COLUMN_13 ,
PK_COLUMN_14 ,
PK_COLUMN_15 ,
PK_COLUMN_16
)
SELECT OBJECT_NAME(sr.constid) AS CONSTRAINT_NAME,
OBJECT_NAME(sr.fkeyid) AS FK_TABLE_NAME,
OBJECT_NAME(sr.rkeyid) AS PK_TABLE_NAME,
CASE OBJECTPROPERTY(sr.constid, 'CnstIsDeleteCascade')
WHEN 0 THEN 'NO ACTION'
WHEN 1 THEN 'CASCADE'
END AS DELETE_ACTION,
CASE OBJECTPROPERTY(sr.constid, 'CnstIsUpdateCascade')
WHEN 0 THEN 'NO ACTION'
WHEN 1 THEN 'CASCADE'
END AS UPDATE_ACTION,
fkcol_1.name AS FK_COLUMN_NAME_1,
fkcol_2.name AS FK_COLUMN_NAME_2,
fkcol_3.name AS FK_COLUMN_NAME_3,
fkcol_4.name AS FK_COLUMN_NAME_4,
fkcol_5.name AS FK_COLUMN_NAME_5,
fkcol_6.name AS FK_COLUMN_NAME_6,
fkcol_7.name AS FK_COLUMN_NAME_7,
fkcol_8.name AS FK_COLUMN_NAME_8,
fkcol_9.name AS FK_COLUMN_NAME_9,
fkcol_10.name AS FK_COLUMN_NAME_10,
fkcol_11.name AS FK_COLUMN_NAME_11,
fkcol_12.name AS FK_COLUMN_NAME_12,
fkcol_13.name AS FK_COLUMN_NAME_13,
fkcol_14.name AS FK_COLUMN_NAME_14,
fkcol_15.name AS FK_COLUMN_NAME_15,
fkcol_16.name AS FK_COLUMN_NAME_16,
pkcol_1.name AS PK_COLUMN_NAME_1,
pkcol_2.name AS PK_COLUMN_NAME_2,
pkcol_3.name AS PK_COLUMN_NAME_3,
pkcol_4.name AS PK_COLUMN_NAME_4,
pkcol_5.name AS PK_COLUMN_NAME_5,
pkcol_6.name AS PK_COLUMN_NAME_6,
pkcol_7.name AS PK_COLUMN_NAME_7,
pkcol_8.name AS PK_COLUMN_NAME_8,
pkcol_9.name AS PK_COLUMN_NAME_9,
pkcol_10.name AS PK_COLUMN_NAME_10,
pkcol_11.name AS PK_COLUMN_NAME_11,
pkcol_12.name AS PK_COLUMN_NAME_12,
pkcol_13.name AS PK_COLUMN_NAME_13,
pkcol_14.name AS PK_COLUMN_NAME_14,
pkcol_15.name AS PK_COLUMN_NAME_15,
pkcol_16.name AS PK_COLUMN_NAME_16
FROM sysreferences sr
LEFT OUTER JOIN syscolumns fkcol_1 ON sr.fkeyid = fkcol_1.id AND sr.fkey1 =
fkcol_1.colid
LEFT OUTER JOIN syscolumns fkcol_2 ON sr.fkeyid = fkcol_2.id AND sr.fkey2 =
fkcol_2.colid
LEFT OUTER JOIN syscolumns fkcol_3 ON sr.fkeyid = fkcol_3.id AND sr.fkey3 =
fkcol_3.colid
LEFT OUTER JOIN syscolumns fkcol_4 ON sr.fkeyid = fkcol_4.id AND sr.fkey4 =
fkcol_4.colid
LEFT OUTER JOIN syscolumns fkcol_5 ON sr.fkeyid = fkcol_5.id AND sr.fkey5 =
fkcol_5.colid
LEFT OUTER JOIN syscolumns fkcol_6 ON sr.fkeyid = fkcol_6.id AND sr.fkey6 =
fkcol_6.colid
LEFT OUTER JOIN syscolumns fkcol_7 ON sr.fkeyid = fkcol_7.id AND sr.fkey7 =
fkcol_7.colid
LEFT OUTER JOIN syscolumns fkcol_8 ON sr.fkeyid = fkcol_8.id AND sr.fkey8 =
fkcol_8.colid
LEFT OUTER JOIN syscolumns fkcol_9 ON sr.fkeyid = fkcol_9.id AND sr.fkey9 =
fkcol_9.colid
LEFT OUTER JOIN syscolumns fkcol_10 ON sr.fkeyid = fkcol_10.id AND sr.fkey10
= fkcol_10.colid
LEFT OUTER JOIN syscolumns fkcol_11 ON sr.fkeyid = fkcol_11.id AND sr.fkey11
= fkcol_11.colid
LEFT OUTER JOIN syscolumns fkcol_12 ON sr.fkeyid = fkcol_12.id AND sr.fkey12
= fkcol_12.colid
LEFT OUTER JOIN syscolumns fkcol_13 ON sr.fkeyid = fkcol_13.id AND sr.fkey13
= fkcol_13.colid
LEFT OUTER JOIN syscolumns fkcol_14 ON sr.fkeyid = fkcol_14.id AND sr.fkey14
= fkcol_14.colid
LEFT OUTER JOIN syscolumns fkcol_15 ON sr.fkeyid = fkcol_15.id AND sr.fkey15
= fkcol_15.colid
LEFT OUTER JOIN syscolumns fkcol_16 ON sr.fkeyid = fkcol_16.id AND sr.fkey16
= fkcol_16.colid
LEFT OUTER JOIN syscolumns pkcol_1 ON sr.rkeyid = pkcol_1.id AND sr.rkey1 =
pkcol_1.colid
LEFT OUTER JOIN syscolumns pkcol_2 ON sr.rkeyid = pkcol_2.id AND sr.rkey2 =
pkcol_2.colid
LEFT OUTER JOIN syscolumns pkcol_3 ON sr.rkeyid = pkcol_3.id AND sr.rkey3 =
pkcol_3.colid
LEFT OUTER JOIN syscolumns pkcol_4 ON sr.rkeyid = pkcol_4.id AND sr.rkey4 =
pkcol_4.colid
LEFT OUTER JOIN syscolumns pkcol_5 ON sr.rkeyid = pkcol_5.id AND sr.rkey5 =
pkcol_5.colid
LEFT OUTER JOIN syscolumns pkcol_6 ON sr.rkeyid = pkcol_6.id AND sr.rkey6 =
pkcol_6.colid
LEFT OUTER JOIN syscolumns pkcol_7 ON sr.rkeyid = pkcol_7.id AND sr.rkey7 =
pkcol_7.colid
LEFT OUTER JOIN syscolumns pkcol_8 ON sr.rkeyid = pkcol_8.id AND sr.rkey8 =
pkcol_8.colid
LEFT OUTER JOIN syscolumns pkcol_9 ON sr.rkeyid = pkcol_9.id AND sr.rkey9 =
pkcol_9.colid
LEFT OUTER JOIN syscolumns pkcol_10 ON sr.rkeyid = pkcol_10.id AND sr.rkey10
= pkcol_10.colid
LEFT OUTER JOIN syscolumns pkcol_11 ON sr.rkeyid = pkcol_11.id AND sr.rkey11
= pkcol_11.colid
LEFT OUTER JOIN syscolumns pkcol_12 ON sr.rkeyid = pkcol_12.id AND sr.rkey12
= pkcol_12.colid
LEFT OUTER JOIN syscolumns pkcol_13 ON sr.rkeyid = pkcol_13.id AND sr.rkey13
= pkcol_13.colid
LEFT OUTER JOIN syscolumns pkcol_14 ON sr.rkeyid = pkcol_14.id AND sr.rkey14
= pkcol_14.colid
LEFT OUTER JOIN syscolumns pkcol_15 ON sr.rkeyid = pkcol_15.id AND sr.rkey15
= pkcol_15.colid
LEFT OUTER JOIN syscolumns pkcol_16 ON sr.rkeyid = pkcol_16.id AND sr.rkey16
= pkcol_16.colid
INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
ON OBJECT_NAME(sr.constid) = rc.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu_fk
ON rc.CONSTRAINT_NAME = ccu_fk.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu_pk
ON rc.UNIQUE_CONSTRAINT_NAME = ccu_pk.CONSTRAINT_NAME
WHERE EXISTS(SELECT NULL FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
ccu1
INNER JOIN INFORMATION_SCHEMA.COLUMNS c
ON ccu1.TABLE_NAME = c.TABLE_NAME
AND ccu1.COLUMN_NAME = c.COLUMN_NAME
WHERE c.COLLATION_NAME <> @collation
AND (ccu1.CONSTRAINT_NAME = rc.CONSTRAINT_NAME))
-- Drop the foreign keys
--DECLARE @sql_1 VARCHAR(4000)
WHILE 1=1
BEGIN
SET @sql = (SELECT TOP 1 'ALTER TABLE ' + QUOTENAME(FK_TABLE_NAME)
+ ' DROP CONSTRAINT ' + QUOTENAME(CONSTRAINT_NAME)
FROM #FOREIGN_KEYS
WHERE EXISTS(SELECT NULL FROM information_schema.table_constraints tc
WHERE tc.constraint_name = #FOREIGN_KEYS.CONSTRAINT_NAME))
IF @sql IS NULL BREAK
EXEC (@sql)
IF @debug = 1 PRINT @sql
END
INSERT INTO #COMPUTED_COLUMNS(
TABLE_NAME,
COLUMN_NAME,
FORMULA)
SELECT c.column_name, c.table_name, sc.text
FROM information_schema.columns c
INNER JOIN information_schema.tables t
ON c.table_name = t.table_name
INNER JOIN syscolumns col
ON c.table_name = object_name(col.id)
AND c.column_name = col.name
INNER JOIN syscomments sc
ON col.id = sc.id AND col.colid = sc.colid
WHERE t.table_type = 'BASE TABLE'
INSERT INTO #UNIQUE_CONSTRAINTS(
CONSTRAINT_NAME,
TABLE_NAME,
CONSTRAINT_TYPE,
CLUSTER_TYPE
)
SELECT tc.constraint_name,
tc.table_name,
tc.constraint_type,
CASE INDEXPROPERTY(OBJECT_ID(tc.table_name), tc.constraint_name,
'IsClustered')
WHEN 1 THEN 'CLUSTERED'
ELSE 'NONCLUSTERED'
END AS ClusterType
FROM information_schema.table_constraints tc
WHERE tc.CONSTRAINT_TYPE IN ('UNIQUE', 'PRIMARY KEY')
AND EXISTS(SELECT NULL FROM #COLLATE_COLUMNS cc
INNER JOIN information_schema.constraint_column_usage ccu
ON ccu.TABLE_NAME = cc.TABLE_NAME
AND ccu.COLUMN_NAME = cc.COLUMN_NAME
INNER JOIN information_schema.referential_constraints rc
ON ccu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
OR ccu.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME
WHERE ccu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME)
INSERT INTO #UNIQUE_CONSTRAINTS_COLUMNS(
CONSTRAINT_NAME,
COLUMN_NAME,
KEYNO)
SELECT si.name,
col.name,
sik.keyno
FROM sysindexes si
INNER JOIN sysindexkeys sik
ON si.id = sik.id AND si.indid = sik.indid
INNER JOIN syscolumns col
ON sik.id = col.id AND sik.colid = col.colid
INNER JOIN #UNIQUE_CONSTRAINTS uc
ON si.name = uc.constraint_name
WHILE 1=1
BEGIN
SET @sql = (SELECT TOP 1 'ALTER TABLE ' + QUOTENAME(TABLE_NAME)
+ ' DROP CONSTRAINT ' + QUOTENAME(CONSTRAINT_NAME)
FROM #UNIQUE_CONSTRAINTS
WHERE EXISTS(SELECT NULL FROM information_schema.table_constraints tc
WHERE tc.CONSTRAINT_NAME = #UNIQUE_CONSTRAINTS.CONSTRAINT_NAME))
IF @sql IS NULL BREAK
IF @debug = 1 PRINT @sql
EXEC (@sql)
END
INSERT INTO #INDEXES(
TABLE_NAME,
INDEX_NAME,
CLUSTER_TYPE
)
SELECT
OBJECT_NAME(id) AS Table_Name,
name AS Index_Name,
CASE INDEXPROPERTY(si.id, si.name, 'IsClustered')
WHEN 1 THEN 'CLUSTERED'
ELSE 'NONCLUSTERED'
END AS ClusterType
FROM sysindexes si
WHERE INDEXPROPERTY(si.id, si.name, 'IsHypothetical') = 0
AND INDEXPROPERTY(si.id, si.name, 'IsStatistics') = 0
AND INDEXPROPERTY(si.id, si.name, 'IsFulltextKey') = 0
AND OBJECTPROPERTY(si.id, 'IsMSShipped') = 0
AND si.indid < 255
AND EXISTS(SELECT NULL FROM sysindexkeys sik
INNER JOIN syscolumns sc
ON sik.id = sc.id AND sik.colid = sc.colid
WHERE sc.COLLATION <> @collation
AND sik.id = si.id AND sik.indid = si.indid)
INSERT INTO #INDEX_COLUMNS(
TABLE_NAME,
INDEX_NAME,
COLUMN_NAME,
KEYNO)
SELECT
OBJECT_NAME(sik.id) AS Table_Name,
si.name AS Index_Name,
col.name AS column_name,
keyno
FROM sysindexkeys sik
INNER JOIN sysindexes si
ON sik.id = si.id
AND sik.indid = si.indid
INNER JOIN syscolumns col
ON sik.id = col.id
AND sik.colid = col.colid
INNER JOIN #INDEXES i
ON i.INDEX_NAME = si.name
AND i.TABLE_NAME = OBJECT_NAME(si.id)
WHILE 1=1
BEGIN
SET @sql = (SELECT TOP 1 'DROP INDEX ' + QUOTENAME(TABLE_NAME) + '.' +
QUOTENAME(INDEX_NAME)
FROM #INDEXES
WHERE EXISTS(SELECT NULL FROM sysindexes
WHERE OBJECT_NAME(id) = TABLE_NAME
AND name = INDEX_NAME))
IF @sql IS NULL BREAK
IF @debug = 1 PRINT @sql
EXEC (@sql)
END
IF @debug = 1
BEGIN
SELECT * FROM #CHECK_CONSTRAINTS
SELECT * FROM #FOREIGN_KEYS
SELECT * FROM #COMPUTED_COLUMNS
SELECT * FROM #INDEXES
SELECT * FROM #INDEX_COLUMNS
END
-- Alter the database collation
-- ALTER DATABASE RMIS COLLATE Latin1_General_CI_AS
WHILE 1=1
BEGIN
SET @sql = (SELECT TOP 1 'ALTER TABLE ' + QUOTENAME(c.TABLE_NAME)
+ ' ALTER COLUMN ' + QUOTENAME(c.COLUMN_NAME) + ' '
+ c.DATA_TYPE + '(' + CAST(c.CHARACTER_MAXIMUM_LENGTH AS VARCHAR(5))
+ ') COLLATE ' + @collation
+ ' ' + CASE c.IS_NULLABLE WHEN 'YES' THEN 'NULL' WHEN 'No' THEN 'NOT
NULL' END
FROM information_schema.columns c
INNER JOIN information_schema.tables t
ON c.table_name = t.table_name
WHERE c.collation_name <> @collation
AND t.table_type = 'BASE TABLE')
IF @sql IS NULL BREAK
IF @debug = 1 PRINT @sql
EXEC (@sql)
END
-- Recreate the foreign keys
WHILE 1=1
BEGIN
SET @constraint_name = (SELECT TOP 1 CONSTRAINT_NAME
FROM #FOREIGN_KEYS
WHERE NOT EXISTS(SELECT NULL FROM information_schema.table_constraints tc
WHERE tc.constraint_name = #FOREIGN_KEYS.CONSTRAINT_NAME))
IF @constraint_name IS NULL BREAK
SELECT
@sql_1 = 'ALTER TABLE ' + QUOTENAME(FK_TABLE_NAME)
+ ' ADD CONSTRAINT ' + QUOTENAME(CONSTRAINT_NAME) + ' FOREIGN KEY ('
+ COALESCE(QUOTENAME(FK_COLUMN_1), '')
+ COALESCE(', ' + QUOTENAME(FK_COLUMN_2), '')
+ COALESCE(', ' + QUOTENAME(FK_COLUMN_3), '')
+ COALESCE(', ' + QUOTENAME(FK_COLUMN_4), '')
+ COALESCE(', ' + QUOTENAME(FK_COLUMN_5), '')
+ COALESCE(', ' + QUOTENAME(FK_COLUMN_6), '')
+ COALESCE(', ' + QUOTENAME(FK_COLUMN_7), '')
+ COALESCE(', ' + QUOTENAME(FK_COLUMN_8), '')
+ COALESCE(', ' + QUOTENAME(FK_COLUMN_9), '')
+ COALESCE(', ' + QUOTENAME(FK_COLUMN_10), '')
+ COALESCE(', ' + QUOTENAME(FK_COLUMN_11), '')
+ COALESCE(', ' + QUOTENAME(FK_COLUMN_12), '')
+ COALESCE(', ' + QUOTENAME(FK_COLUMN_13), '')
+ COALESCE(', ' + QUOTENAME(FK_COLUMN_14), '')
+ COALESCE(', ' + QUOTENAME(FK_COLUMN_15), '')
+ COALESCE(', ' + QUOTENAME(FK_COLUMN_16), '')
+') REFERENCES ' + QUOTENAME(PK_TABLE_NAME) + ' ('
+ COALESCE(QUOTENAME(PK_COLUMN_1), '')
+ COALESCE(', ' + QUOTENAME(PK_COLUMN_2), '')
+ COALESCE(', ' + QUOTENAME(PK_COLUMN_3), '')
+ COALESCE(', ' + QUOTENAME(PK_COLUMN_4), '')
+ COALESCE(', ' + QUOTENAME(PK_COLUMN_5), '')
+ COALESCE(', ' + QUOTENAME(PK_COLUMN_6), '')
+ COALESCE(', ' + QUOTENAME(PK_COLUMN_7), '')
+ COALESCE(', ' + QUOTENAME(PK_COLUMN_8), '')
+ COALESCE(', ' + QUOTENAME(PK_COLUMN_9), '')
+ COALESCE(', ' + QUOTENAME(PK_COLUMN_10), '')
+ COALESCE(', ' + QUOTENAME(PK_COLUMN_11), '')
+ COALESCE(', ' + QUOTENAME(PK_COLUMN_12), '')
+ COALESCE(', ' + QUOTENAME(PK_COLUMN_13), '')
+ COALESCE(', ' + QUOTENAME(PK_COLUMN_14), '')
+ COALESCE(', ' + QUOTENAME(PK_COLUMN_15), '')
+ COALESCE(', ' + QUOTENAME(PK_COLUMN_16), '')
+ ') ON DELETE '+ DELETE_RULE + ' ON UPDATE ' + UPDATE_RULE
FROM #FOREIGN_KEYS
WHERE CONSTRAINT_NAME = @constraint_name
EXEC(@sql_1)
IF @debug = 1 PRINT @sql_1
END
WHILE 1=1
BEGIN
SET ROWCOUNT 1
SELECT TOP 1 @index_name = INDEX_NAME,
@table_name = TABLE_NAME,
@cluster_type = CLUSTER_TYPE
FROM #INDEXES
WHERE NOT EXISTS(SELECT NULL FROM sysindexes
WHERE OBJECT_NAME(id) = TABLE_NAME
AND name = INDEX_NAME)
ORDER BY CLUSTER_TYPE -- Build clustered indexes first
SET ROWCOUNT 0
IF @index_name IS NULL BREAK
IF NOT EXISTS(SELECT NULL FROM #INDEXES) BREAK
SET @sql_1 = 'CREATE ' + @cluster_type + ' INDEX ' + QUOTENAME(@index_name)
+ ' ON ' + QUOTENAME(@table_name) + '('
SET @keyno = 0
WHILE 1=1
BEGIN
SET @keyno = (SELECT MIN(KEYNO) FROM #INDEX_COLUMNS
WHERE INDEX_NAME = @index_name
AND TABLE_NAME = @table_name
AND KEYNO > @keyno)
IF @keyno IS NULL BREAK
SET @sql_1 = @sql_1 + (SELECT QUOTENAME(COLUMN_NAME) + ', '
FROM #INDEX_COLUMNS
WHERE INDEX_NAME = @index_name
AND TABLE_NAME = @table_name
AND KEYNO = @keyno)
END
SET @sql_1 = LEFT(RTRIM(@sql_1), LEN(RTRIM(@sql_1)) -1) + ')'
IF @debug = 1 PRINT @sql_1
IF NOT EXISTS(SELECT NULL FROM information_schema.table_constraints
WHERE CONSTRAINT_NAME = @index_name)
EXEC (@sql_1)
DELETE FROM #INDEXES WHERE INDEX_NAME = @index_name AND TABLE_NAME =
@table_name
DELETE FROM #INDEX_COLUMNS WHERE INDEX_NAME = @index_name AND TABLE_NAME =
@table_name
END
WHILE 1=1
BEGIN
SET @sql = (SELECT TOP 1 'ALTER TABLE ' + QUOTENAME(TABLE_NAME)
+ ' ADD CONSTRAINT ' + QUOTENAME(CONSTRAINT_NAME)
+ ' CHECK ' + CHECK_CLAUSE
FROM #CHECK_CONSTRAINTS
WHERE NOT EXISTS(SELECT NULL FROM information_schema.table_constraints tc
WHERE tc.constraint_name = #CHECK_CONSTRAINTS.CONSTRAINT_NAME))
IF @sql IS NULL BREAK
IF @debug = 1 PRINT @sql
EXEC (@sql)
END
DROP TABLE #CHECK_CONSTRAINTS, #FOREIGN_KEYS, #COMPUTED_COLUMNS, #INDEXES,
#INDEX_COLUMNS
IF @@TRANCOUNT > 0 AND @debug = 1
ROLLBACK TRAN
IF @@TRANCOUNT > 0 AND @debug = 0
COMMIT TRAN
<anonymous@discussions.microsoft.com> wrote in message
news:949e01c4336d$a59936b0$a001280a@phx.gbl...
> Hi,
>
> We are in the process of converting our application DB
> char and varchar columns to nchar/nvarchar
> recpectively.Our application suuports dynamic tables i.e
> each customer will have set of standard tables and dynamic
> tables which are created based on his application
> customization..
>
> I am following the below methodology for the same.
>
> 1.Generate script for tables ,constraints and indexes.
>
> 2.drop constraints.
>
> 3.drop all indexes
>
> 4.alter tables to have nchar and nvarchar
>
> 4.using script created in the step..recreate all
> constraints and indexes..
>
> Pls evaluate my methodology and help me in getting scripts
> for the steps 2,3,4 .....
>
>
> Sridhar
>
>
> >-----Original Message-----
> >What do you actually want to achieve? You ahve to take
> into account that
> >there are entries in sysindexes as well for indexes that
> a created when you
> >create a Primary key or Unique constraint, and you can't
> drop them with DROP
> >INDEX, you have to use DROP CONSTRAINT for them. Do you
> wan tto drop them as
> >well? And what do you mean with "dynamic" tables?
> >
> >--
> >Jacco Schalkwijk
> >SQL Server MVP
> >
> >
> ><anonymous@discussions.microsoft.com> wrote in message
> >news:93bb01c4335e$7db89e10$a001280a@phx.gbl...
> >>
> >> select 'Drop index ' + a.name + '.'+ b.name + char(13) +
> >> char(10) + 'go'
> >> from sysobjects a , sysindexes b
> >> where a.id=b.id
> >> and a.type='U'
> >> order by a.name
> >>
> >> Then how do i drop all indexes on my application
> tables ..
> >> It contains dynamic tables too...
> >>
> >> >-----Original Message-----
> >> >Not all entries in sysindexes are indexes that you can
> >> drop. Some are
> >> >statistics that can't be dropped with DROP INDEX, and
> >> indexes with indid =0
> >> >(table with no clustered index) or 255 (text, ntext,
> >> image column) can't be
> >> >dropped either. It would be helpful if you post your
> >> script.
> >> >
> >> >--
> >> >Jacco Schalkwijk
> >> >SQL Server MVP
> >> >
> >> >
> >> ><anonymous@discussions.microsoft.com> wrote in message
> >> >news:920201c43343$d3f54af0$a101280a@phx.gbl...
> >> >> will there be references for dropped indexes in
> >> >> sysindexes..?
> >> >>
> >> >> I created a script to drop all indexes..when i ran
> some
> >> of
> >> >> them got dropped..and some threw error..when i re-ran
> >> the
> >> >> script it says that index is not system
> catalog..however
> >> >> when i query sysindexes they are still there..
> >> >>
> >> >> any help on this is welcome..
> >> >>
> >> >> Sridhar
> >> >
> >> >
> >> >.
> >> >
> >
> >
> >.
> >
- Next message: SQLNerdz: "Re: avoid Timeout expired?"
- Previous message: Narayana Vyas Kondreddi: "Re: Recover DB from the expired evaluation copy of SQL 2000 Server"
- In reply to: anonymous_at_discussions.microsoft.com: "Re: sysindexes"
- Next in thread: anonymous_at_discussions.microsoft.com: "Re: sysindexes"
- Reply: anonymous_at_discussions.microsoft.com: "Re: sysindexes"
- Messages sorted by: [ date ] [ thread ]
Relevant Pages
|