2013-03-25 54 views

回答

0

複製從查詢結果中這些命令並執行:

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' 

但是:

  • 您需要加入表的信息,只選擇表(上面的查詢將返回的意見,太)
  • 它不會讓你改變一些列,例如與PK/FK constrints
  • 此選擇可能也列出您不希望/不能修改的表。例如。 sysdiagrams
  • 這樣做通常不是一個好主意,如果你不是將它限制在幾張你完全知道結構的表上。
+0

正確的想法,但這種危險會設置每列到該實例的默認爲空,將不會過濾掉的意見,並會返回一個行,每列,無論數據類型(意爲DBA更多的手動工作)。 – 2013-03-25 14:42:15

+0

我指出它不會過濾視圖,除其他通知... – 2013-03-25 14:45:47

0

起初,它可能看起來這麼簡單:

  1. 從INFORMATION_SCHEMA使用遊標循環通過選擇。
  2. 爲每個感興趣的列編寫動態SQL,這些列將使用ALTER TABLE語句更改其數據類型。
  3. 執行動態SQL。

但是,您需要先刪除這些列上任何索引,外鍵約束等 然後,當你完成,你可以重新創建約束和索引。

參見這太問題:

Single SQL Query to update datatypes of all columns in a table at one shot

1

我想所有的textntextimage數據類型更改爲新的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圖表模式下進行這些更改可能會更容易。