如何删除,更改然后重新创建使用SQL访问列的所有数据库对象?

时间:2018-11-16 16:55:42

标签: sql sql-server tsql sql-server-2016

我有一个巨大的旧式旧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然后重新创建它们?

相关问题:

1 个答案:

答案 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

一旦获得数据,可能会有更好的方法来做最后一部分,我会让你去做。希望这会有所帮助。