我有一個數據庫(Sql Server 2005),其中有數十個表,其中每個表都有許多列(平均爲10-20),數據類型設置爲nvarchar (最大值)。這絕對是殺死性能(其中一些列用於連接,一些表有100K +行)。我想將所有這些列更改爲varchar(250)。什麼是自動執行此操作的最佳方式? (我可以使用Management Studio,或者我可以通過可訪問數據庫的ASP.net網站創建一個實用程序來執行此操作,無論哪個更容易)。如何將一個DataType的所有Sql列更改爲另一個
回答
下面是一個使用INFORMATION_SCHEMA.COLUMNS
找到所有*varchar(max)
列,並將它們轉換爲varchar(255)
工作腳本:
declare @schema nvarchar(255)
declare @table nvarchar(255)
declare @col nvarchar(255)
declare @dtype nvarchar(255)
declare @sql nvarchar(max)
declare maxcols cursor for
select
c.TABLE_SCHEMA,
c.TABLE_NAME,
c.COLUMN_NAME,
c.DATA_TYPE
from
INFORMATION_SCHEMA.COLUMNS c
inner 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
and t.TABLE_TYPE = 'BASE TABLE'
where
c.DATA_TYPE like '%varchar'
and c.CHARACTER_MAXIMUM_LENGTH = -1
open maxcols
fetch next from maxcols into @schema, @table, @col, @dtype
while @@FETCH_STATUS = 0
begin
set @sql = 'alter table [' + @schema + '].[' + @table +
'] alter column [' + @col + '] ' + @dtype + '(255)'
exec sp_executesql @sql
fetch next from maxcols into @schema, @table, @col, @dtype
end
close maxcols
deallocate maxcols
這是他們唯一的使用,我曾經縱容遊標,但這是一個很好的。基本上,它找到所有*varchar(max)
,生成alter
語句,然後使用sp_executesql
執行它。
享受!
我認爲完成此任務的最佳方法是爲當前數據庫生成腳本,然後在文本文件上用varchar(250)替換nvarchar(max),然後創建新數據庫。之後使用導入/導出實用程序將數據傳輸到新數據庫。
這不起作用 - SSIS將返回一條錯誤消息,指出列元數據在源表和目標表之間不匹配 – 2009-08-25 13:17:18
你可以很容易找到它們,使用:
select 'alter table ' + quotename(o.name) + ' alter column ' + quotename(c.name) + ' varchar(250); '
from sys.columns c
join
sys.objects o
on o.object_id = c.object_id
where o.type = 'U'
and c.user_type_id = 231
and c.max_length = -1
所以現在只要抓住你的查詢結果,並運行它。
羅布
值得一提的是......如果您將declare @qry nvarchar(max)並選擇@qry =(.... for xml path('')); exec sp_executesql @qry; - 你可以一步到位。 ....是我目前的查詢。但那麼你不能'理智地檢查'它如此之好。 – 2009-08-25 11:26:16
您是否需要考慮列可空性?這是否會將列更改爲空,因爲它沒有指定任何一種方式? – 2012-03-20 17:04:25
- 1. 如何將此select sql語句更改爲另一個select sql?
- 2. 如何將新列更新爲另一列的第一個字
- 3. 如何將一個列表的一個字段值更新爲另一個列表的另一個字段值?
- 4. 如何將一個列表的所有元素附加到另一個列表?
- 5. Python - 函數有一個列表作爲參數。如何返回另一個列表而不更改第一個?
- 6. SQL將列標題更改爲另一列的值
- 7. 如何將一個散列轉換爲另一個散列?
- 8. 將一個主域的所有變體重寫爲另一個
- 9. Settings.settings - 如何從一個環境更改爲另一個環境?
- 10. 如何一個網址更改爲另一個與jQuery
- 11. 如何一個控制器值更改爲另一個控制
- 12. 如何將所有數據從一個表發送到另一個SQL?
- 13. 如何計算將一個置換更改爲另一個置換的週期?
- 14. 將表中的SQL SQL Pyspark更新值更改爲表中的另一個值
- 15. 在插入的另一個表中更改另一個列值
- 16. 如何將文件的默認值更改爲另一個值?
- 17. 如何將我的apk文件更改爲另一個名稱
- 18. DataGridView,將一個類型列的單元格更改爲另一個類型
- 19. 將一個視圖更改爲另一個
- 20. Excel vba將值從一個表更改爲另一個
- 21. mysql將一列更新到另一個表中的另一列
- 22. 更改基於另一個列PowerQuery列
- 23. 如何更改另一個類的iVar
- 24. 如何更改另一個類的uilabel
- 25. 如何將這個MySQL查詢更改爲一個有效的一個
- 26. 如何將圖像從一個html頁面更改爲另一個?
- 27. 如何將變量從一個.m文件更改爲另一個m文件?
- 28. 如何將一個表的所有字段複製到SQL Server 2005 Express中的另一個更寬的表中?
- 29. 我如何動態地將WPF控件更改爲另一個?
- 30. 如何將UITabBarItem標題從另一個UITabBarItem更改爲標題?
這不起作用,因爲它也帶來了視圖列 – 2009-08-25 11:26:27
@Yaakov:修正! – Eric 2009-08-25 11:44:41
現在,如何在執行此操作時刪除約束條件並將它們放回原處,因爲我們無法通過約束來改變cols? – JosephK 2016-09-08 14:59:19