Sql-Server

將所有數據類型更改為不同的數據類型

  • October 12, 2019

我有一個數據庫,其中包含多個帶有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

引用自:https://dba.stackexchange.com/questions/157771