將所有數據類型更改為不同的數據類型
我有一個數據庫,其中包含多個帶有
datetime2
欄位的表。我需要將所有這些轉換為datetime
欄位。我執行了這個語法,它生成了 300 多個表,需要用大約 1200 個欄位進行更改。select so.name table_name ,sc.name column_name ,st.name data_type 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 ('DATETIME2') ORDER BY so.name ASC
現在,為了速度,我想我會寫一些語法來為我做這件事,但我一定是設置不正確,因為我讓它執行了 30 分鐘,但它仍在執行。如果我執行列印語句,所有內容都會按應有的方式列印出來(至少對我的半訓練有素的眼睛而言)。這些 alter table 語句完成的可接受時間是否超過 30 分鐘,或者是什麼讓我放慢了速度/我不應該使用游標嗎?
Declare @sql nvarchar(max), @tablename varchar(100), @fieldname varchar(100) Select table_name ,column_name FROM #Helper Order by table_name asc DECLARE cursor1 CURSOR FOR Select table_name ,column_name FROM #Helper ORDER BY table_name asc OPEN cursor1 FETCH NEXT FROM cursor1 INTO @tablename, @fieldname WHILE @@FETCH_STATUS = 0 BEGIN Set @SQL = 'Alter Table '+@tablename+' Alter Column '+@fieldname+' datetime' PRINT @SQL --EXEC sp_executesql @sql; FETCH NEXT FROM cursor1 INTO @tablename, @fieldname END CLOSE cursor1 DEALLOCATE cursor1 DROP TABLE #Helper
編輯
我讓語句執行的時間更長一點,發現它實際上遇到了一個錯誤,其中一個約束(可能或不可能)導致程序花費這麼長時間。我正在嘗試執行此語句
Alter Table TestTable Alter Column datecreate datetime
並拋出此錯誤消息:
消息 5074,級別 16,狀態 1,第 1 行
對象“DF__Test_Table___datec__0D7A0286”依賴於列“datecreate”。
消息 4922,級別 16,狀態 9,第 1 行
ALTER TABLE ALTER COLUMN datecreate 失敗,因為一個或多個對象訪問此列。
現在,如果我
script constraint as - create to
這是生成的輸出:ALTER TABLE [dbo].[TestTable] ADD DEFAULT (getdate()) FOR [datecreate]
那裡(對我而言)似乎沒有將此列保留為
datetime2
數據類型。我是否需要在我的語法中添加額外的檢查以確定列是否有約束,如果有,則刪除約束並將其添加回來?
將 datetime2 更改為 datetime 是一種基本的數據類型更改。每個都
ALTER
將更新指定表中的每一行。這可能需要一段時間,具體取決於表的大小,尤其是在最大的表有很多 datetime2 列的情況下。此外,如果有任何其他並發活動,則 DDL 將被其他活動阻塞。
首先執行:
ALTER TABLE TestTable DROP CONSTRAINT DF__Test_Table___datec__0D7A0286
然後執行:
Alter Table TestTable Alter Column datecreate datetime