我有一个巨大的旧式旧SQL Server数据库。我正在尝试将每个datetime
更改为datetime2
,但是简单的方法(使用游标循环TSQL脚本)会遇到很多类似问题:
MSG 5074,第16级,状态1,第1行
索引“ IX_Table_ColId_ModifiedOn”取决于列“ ModifiedOn”消息4922,第16级,状态9,第1行
ALTER TABLE ALTER COLUMN ModifiedOn失败,因为一个或多个对象访问此列。
除索引外,还有计算列,默认约束和使用这些列的其他事物,从而阻止ALTER。
避免停机对于我们来说不是问题。是否有一种神奇的TSQL脚本或技术可以找到与列/表连接的事物,暂时删除它们,允许ALTER然后重新创建它们?
相关问题:
答案 0 :(得分:0)
我想您可以尝试查找具有数据类型为DATETIME
的列的所有表,以及它们是否具有任何索引。请考虑以下因素:
create table #TempTable (
TableName VARCHAR(MAX),
ColumnName VARCHAR(MAX),
IndexName VARCHAR(MAX)
)
;WITH CTE1(TableName, ColumnName) AS
(
SELECT
so.name table_name
,sc.name column_name
from sysobjects so
inner join syscolumns sc on (so.id = sc.id)
inner join systypes st on (st.type = sc.type)
where so.type = 'U'
and st.name IN ('DATETIME')
),
CTE2(TABLEName, ColumnName, IndexName) AS
(
SELECT cte1.TableName, c.name, i.name
FROM sys.index_columns AS ic
INNER JOIN sys.indexes AS i
ON ic.[object_id] = i.[object_id]
AND ic.index_id = i.index_id
INNER JOIN sys.columns AS c
ON ic.[object_id] = c.[object_id]
AND ic.column_id = c.column_id
INNER JOIN cte1 AS cte1 ON cte1.columnName = c.name
)
INSERT INTO #TempTable
SELECT DISTINCT * FROM CTE2
SELECT * FROM #TempTable
然后,您可以执行一些动态SQL来执行以下操作:
--Dynamic SQL populate values
BEGIN
-- drop index
-- alter column
-- delete row from temp table
-- recreate index
-- process next row
END
一旦获得数据,可能会有更好的方法来做最后一部分,我会让你去做。希望这会有所帮助。