2012-03-21 40 views
0

我的SQL Server實例中有幾千個表,我需要開始將舊的棄用數據類型轉換爲新版本(text to varchar(max))。是否可以編寫腳本,以便我可以運行select語句來查找所有這些,而無需手動瀏覽數據庫實例中的每個表? TIA在SQL Server中查找文本數據類型的腳本

回答

2
SELECT OBJECT_SCHEMA_NAME([object_id]), 
    OBJECT_NAME([object_id]), 
    name 
FROM sys.columns 
WHERE system_type_id IN (35,99); 

你甚至可以做到這一點,生成一組命令來更改表:

SELECT 'ALTER TABLE ' 
    + QUOTENAME(OBJECT_SCHEMA_NAME([object_id])) 
    + '.' + QUOTENAME(OBJECT_NAME([object_id])) 
    + ' ALTER COLUMN ' + QUOTENAME(name) 
    + ' ' + CASE system_type_id WHEN 99 THEN 'N' ELSE '' END 
    + 'VARCHAR(MAX);' 
FROM sys.columns 
WHERE system_type_id IN (35,99); 

當然你也想要處理可空性等,但這只是一個起點。

+0

真棒亞倫(謝謝你今天回答我的問題)。即使給出改變陳述,我希望我可以給你額外的分數! – ganders 2012-03-21 17:55:22

+0

我試着運行我的轉換,它說我不能將'圖像'數據類型轉換爲varchar(max)或nvarchar(max)。是否應該更改爲varbinary(max)? – ganders 2012-03-22 16:17:56

1

您可以使用此INFORMATION_SCHEMA意見。

SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE DATA_TYPE = 'text' 
+0

我實際上建議避免使用'INFORMATION_SCHEMA'視圖:http://sqlblog.com/blogs/aaron_bertrand/archive/2011/11/03/the-case-against-information-schema-views.aspx – 2012-03-21 17:42:48

0

試試這個

SELECT OBJECT_NAME(c.OBJECT_ID) TableName, c.name ColumnName, 
    t.name, c.max_length, c.precision, c.scale 
FROM sys.columns AS c 
JOIN sys.types AS t ON c.user_type_id=t.user_type_id 
WHERE t.name = 'text' 
ORDER BY c.OBJECT_ID; 
+0

爲什麼你當你知道類型是文本時需要max_length,precision和scale嗎?你爲什麼不使用AS或=作爲你的別名?爲什麼你需要連接,當你可以很容易地從sys.columns派生type_id?這個命令對你有什麼好處呢?你爲什麼忽略模式,在不同模式下可能有兩個同名的表? – 2012-03-21 17:41:51

+0

我用通用的方式寫出來演示它。您可以根據需要瀏覽這些表格並獲取更多詳細信息。 – PraveenVenu 2012-03-21 17:46:07

相關問題