I know I can index a column in a table with the command:
我知道我可以用命令在表中索引一列:
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
However, I have a database of 250 schemas with 10 tables each. How can I, for each table, check if a column exists, and then create an index for it (if it does exist)?
但是,我有一个包含250个模式的数据库,每个数据库包含10个表。对于每个表,我如何检查列是否存在,然后为它创建索引(如果确实存在)?
I am using SQL Server 2012.
我正在使用SQL Server 2012。
2 个解决方案
#1
5
A small variation on Banana's answer is to use INFORMATION_SCHEMA.COLUMNS to grab the final list of tables directly:
关于Banana的回答有一个小变化,就是使用INFORMATION_SCHEMA。列直接抓取最终的表列表:
-- Define column to index.
DECLARE @coltoindex VARCHAR(20), @indexoptions VARCHAR(30)
SET @coltoindex = 'Id'
SET @indexoptions = 'UNIQUE'
--USE database_name
--IF OBJECT_ID('tempdb..#tables') IS NOT NULL DROP TABLE #tables
SELECT table_schema, table_name INTO #tables FROM information_schema.columns
where COLUMN_NAME = @coltoindex
DECLARE @schema VARCHAR(30), @table VARCHAR(20), @sqlCommand varchar(1000)
WHILE (SELECT COUNT(*) FROM #tables) > 0
BEGIN
SELECT TOP 1 @schema = table_schema, @table = table_name FROM #tables
SET @sqlCommand = '
CREATE ' + @indexoptions + ' INDEX
idx_' + @schema + '_' + @table + '_' + @coltoindex + '
ON ' + @schema + '.' + @table + ' (' + @coltoindex + ')'
-- print @sqlCommand
EXEC (@sqlCommand)
DELETE FROM #tables WHERE table_schema = @schema AND table_name = @table
END
#2
2
A simple way of achieving what you want, is to loop over all tables through information_schema.tables
and then create the index if the row exists in that table:
实现所需的简单方法是通过information_schema对所有表进行循环。如果该表中存在行,则创建索引:
-- Define column to index.
DECLARE @coltoindex VARCHAR(20), @indexoptions VARCHAR(30)
SET @coltoindex = 'Id'
SET @indexoptions = 'UNIQUE'
USE database_name
--IF OBJECT_ID('tempdb..#tables') IS NOT NULL DROP TABLE #tables
SELECT table_schema, table_name INTO #tables FROM information_schema.tables
DECLARE @schema VARCHAR(30), @table VARCHAR(20), @sqlCommand varchar(1000)
WHILE (SELECT COUNT(*) FROM #tables) > 0
BEGIN
SELECT TOP 1 @schema = table_schema, @table = table_name FROM #tables
SET @sqlCommand = '
IF EXISTS(SELECT * FROM sys.columns
WHERE [name] = N''' + @coltoindex + '''
AND [object_id] = OBJECT_ID(N''' + @schema + '.' + @table + '''))
BEGIN
CREATE ' + @indexoptions + ' INDEX
idx_' + @schema + '_' + @table + '_' + @coltoindex + '
ON ' + @schema + '.' + @table + ' (' + @coltoindex + ')
END'
EXEC (@sqlCommand)
DELETE FROM #tables WHERE table_schema = @schema AND table_name = @table
END
#1
5
A small variation on Banana's answer is to use INFORMATION_SCHEMA.COLUMNS to grab the final list of tables directly:
关于Banana的回答有一个小变化,就是使用INFORMATION_SCHEMA。列直接抓取最终的表列表:
-- Define column to index.
DECLARE @coltoindex VARCHAR(20), @indexoptions VARCHAR(30)
SET @coltoindex = 'Id'
SET @indexoptions = 'UNIQUE'
--USE database_name
--IF OBJECT_ID('tempdb..#tables') IS NOT NULL DROP TABLE #tables
SELECT table_schema, table_name INTO #tables FROM information_schema.columns
where COLUMN_NAME = @coltoindex
DECLARE @schema VARCHAR(30), @table VARCHAR(20), @sqlCommand varchar(1000)
WHILE (SELECT COUNT(*) FROM #tables) > 0
BEGIN
SELECT TOP 1 @schema = table_schema, @table = table_name FROM #tables
SET @sqlCommand = '
CREATE ' + @indexoptions + ' INDEX
idx_' + @schema + '_' + @table + '_' + @coltoindex + '
ON ' + @schema + '.' + @table + ' (' + @coltoindex + ')'
-- print @sqlCommand
EXEC (@sqlCommand)
DELETE FROM #tables WHERE table_schema = @schema AND table_name = @table
END
#2
2
A simple way of achieving what you want, is to loop over all tables through information_schema.tables
and then create the index if the row exists in that table:
实现所需的简单方法是通过information_schema对所有表进行循环。如果该表中存在行,则创建索引:
-- Define column to index.
DECLARE @coltoindex VARCHAR(20), @indexoptions VARCHAR(30)
SET @coltoindex = 'Id'
SET @indexoptions = 'UNIQUE'
USE database_name
--IF OBJECT_ID('tempdb..#tables') IS NOT NULL DROP TABLE #tables
SELECT table_schema, table_name INTO #tables FROM information_schema.tables
DECLARE @schema VARCHAR(30), @table VARCHAR(20), @sqlCommand varchar(1000)
WHILE (SELECT COUNT(*) FROM #tables) > 0
BEGIN
SELECT TOP 1 @schema = table_schema, @table = table_name FROM #tables
SET @sqlCommand = '
IF EXISTS(SELECT * FROM sys.columns
WHERE [name] = N''' + @coltoindex + '''
AND [object_id] = OBJECT_ID(N''' + @schema + '.' + @table + '''))
BEGIN
CREATE ' + @indexoptions + ' INDEX
idx_' + @schema + '_' + @table + '_' + @coltoindex + '
ON ' + @schema + '.' + @table + ' (' + @coltoindex + ')
END'
EXEC (@sqlCommand)
DELETE FROM #tables WHERE table_schema = @schema AND table_name = @table
END