我試圖一次將所有表中的數據類型從text
更改爲varchar
。針對數據類型的SQL Server 2008批量更改語句
這個查詢
select *
from information_schema.columns
where data_type = 'text'
顯示我的一切我text
數據類型的,但我要如何使用這則改變類型varchar
。
我試圖一次將所有表中的數據類型從text
更改爲varchar
。針對數據類型的SQL Server 2008批量更改語句
這個查詢
select *
from information_schema.columns
where data_type = 'text'
顯示我的一切我text
數據類型的,但我要如何使用這則改變類型varchar
。
複製從查詢結果中這些命令並執行:
select
cmd = 'alter table [' + c.table_schema + '].[' + c.table_name + '] alter column [' + c.column_name + '] varchar(<yoursize>)'
,*
from information_schema.columns c
where c.data_type='text'
但是:
起初,它可能看起來這麼簡單:
但是,您需要先刪除這些列上任何索引,外鍵約束等 然後,當你完成,你可以重新創建約束和索引。
參見這太問題:
Single SQL Query to update datatypes of all columns in a table at one shot
我想所有的text
,ntext
和image
數據類型更改爲新的varchar(max)
,nvarchar(max)
和varbinary(max)
數據類型:
select 'alter table ' + quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)
+ ' alter column ' + quotename(c.COLUMN_NAME) + ' '
+ case c.DATA_TYPE when 'image' then 'varbinary(max)' when 'ntext' then 'nvarchar(max)' when 'text' then 'varchar(max)' end + ' '
+ case c.IS_NULLABLE when 'YES' then 'not' else '' end + ' null;' as SqlCommand
, *
from INFORMATION_SCHEMA.COLUMNS c
join INFORMATION_SCHEMA.TABLES t on c.TABLE_CATALOG = t.TABLE_CATALOG
and c.TABLE_SCHEMA = t.TABLE_SCHEMA
and c.TABLE_NAME = t.TABLE_NAME
where c.DATA_TYPE in ('image', 'ntext', 'text')
and t.TABLE_TYPE = 'BASE TABLE'
只需複製和作爲批處理運行SqlCommand列。
這將處理可空性和濾出視圖。
我不相信你可以把任何類型的唯一性約束上的文本/ NTEXT/image列,所以你可能沒有檢查PK/FK /英國。但是,您必須考慮其他類型的約束和默認值。如果你有很多這些,在SSMS圖表模式下進行這些更改可能會更容易。
正確的想法,但這種危險會設置每列到該實例的默認爲空,將不會過濾掉的意見,並會返回一個行,每列,無論數據類型(意爲DBA更多的手動工作)。 – 2013-03-25 14:42:15
我指出它不會過濾視圖,除其他通知... – 2013-03-25 14:45:47