Raj*_*ore 28 sql sql-server-2005
我有一个仓库表,里面有16吨数据.我有几个Integer列.我们必须为我们编写的每个查询将这些转换为BIGINT,因为SUM太大而不适合INT.
我们现在正在开发一个新的数据集市.所以我们想,为什么不将所有这些列更改为BIGINT,我们不必担心新的查询集.
由于数据已经加载,我想我会使用Management Studio并更改数据类型.但我首先得到一个警告:
Saving Definition Changes to tables with large amounts of data could take a considerable amount of time. While changes are being saved, table data will not be accessible.
然后我收到一个错误:
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
我该如何解决这个问题?
Mar*_*rtW 53
如果这些列中的一个或多个没有对它们的约束(如外键,索引,默认,规则等),您应该能够通过执行快速更改每个列
ALTER TABLE monster ALTER COLUMN MyIntCol1 bigint
Management Studio的更改SQL很少是最有效的,并且倾向于使用临时表来修改现有列.
Red*_*ter 28
不确定这是否有帮助,但试试这个:
1 - create a new bigint column in the table
2 - update that new column with the values from the int column
3 - delete the int column
4 - rename the bigint column
Run Code Online (Sandbox Code Playgroud)
这种技术对我来说非常好用.
我执行了:
use [Mytable]
ALTER TABLE [dbo].[USER] ALTER COLUMN USER_ID bigint NOT NULL
Run Code Online (Sandbox Code Playgroud)
这导致了此错误,因为密钥存在约束:
Msg 5074, Level 16, State 1, Line 2
The object 'PK_USER_USER_ID' is dependent on column 'USER_ID'.
Msg 4922, Level 16, State 9, Line 2
ALTER TABLE ALTER COLUMN USER_ID failed because one or more objects access this column.
Run Code Online (Sandbox Code Playgroud)
不要被吓倒,在SQL Server Management Studio中我右键单击约束PK_USER_USER_ID,然后选择"脚本键为>>删除并创建到>>新查询编辑器窗口":

这生成了这个脚本:
USE [Database]
GO
/****** Object: Index [PK_USER_USER_ID] Script Date: 18/03/2014 13:05:38 ******/
ALTER TABLE [dbo].[USER] DROP CONSTRAINT [PK_USER_USER_ID]
GO
/****** Object: Index [PK_USER_USER_ID] Script Date: 18/03/2014 13:05:38 ******/
ALTER TABLE [dbo].[USER] ADD CONSTRAINT [PK_USER_USER_ID] PRIMARY KEY CLUSTERED
(
[USER_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)
然后,我执行了此脚本的前半部分,以删除约束:
ALTER TABLE [dbo].[USER] DROP CONSTRAINT [PK_USER_USER_ID]
GO
Run Code Online (Sandbox Code Playgroud)
既然约束已经消失,原始的改变很有效:
use [Mytable]
ALTER TABLE [dbo].[USER] ALTER COLUMN USER_ID bigint NOT NULL
Run Code Online (Sandbox Code Playgroud)
然后我执行了脚本的后半部分,将约束添加回来:
ALTER TABLE [dbo].[USER] ADD CONSTRAINT [PK_USER_USER_ID] PRIMARY KEY CLUSTERED
(
[USER_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)
小智 7
我认为您可能遇到的主要错误是GUI正在超时.当您使用SSMS中的修改选项应用大更改时,它将超时.如果通过在SSMS中生成更改脚本来执行相同的命令,然后作为直接SQL查询运行,则它将一直运行直到完成.
| 归档时间: |
|
| 查看次数: |
67782 次 |
| 最近记录: |