我有一个仓库表,里面有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.
我该如何解决这个问题?
答案 0 :(得分:48)
如果其中一个或多个列没有对它们的约束(如外键,索引,默认值,规则等),您应该能够通过执行快速更改每个列
ALTER TABLE monster ALTER COLUMN MyIntCol1 bigint
Management Studio的更改SQL很少是最有效的,并且倾向于支持临时表来修改现有列。
答案 1 :(得分:27)
不确定这是否会有所帮助,但请尝试以下方法:
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
答案 2 :(得分:8)
这项技术非常适合我。
我执行了:
use [Mytable]
ALTER TABLE [dbo].[USER] ALTER COLUMN USER_ID bigint NOT NULL
这导致了此错误,因为密钥存在约束:
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.
不要被阻止,在 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
然后我执行了此脚本的上半部,以删除约束:
ALTER TABLE [dbo].[USER] DROP CONSTRAINT [PK_USER_USER_ID]
GO
现在约束已经消失,原来的改变很有效:
use [Mytable]
ALTER TABLE [dbo].[USER] ALTER COLUMN USER_ID bigint NOT NULL
然后我执行了脚本的后半部分,将约束添加回:
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
答案 3 :(得分:7)
我认为您可能遇到的主要错误是GUI正在超时。当您使用SSMS中的修改选项应用大更改时,它将超时。如果通过在SSMS中生成更改脚本来执行相同的命令,然后作为直接SQL查询运行,它将一直运行直到完成。
答案 4 :(得分:2)
展开OrbMan's回答:
此外,要查看Management Studio在更改表时所执行的所有工作,请单击工具栏图标,该图标看起来像带有软盘的滚动条。这将显示用于更改表的实际SQL命令。
答案 5 :(得分:2)
如果源数据永远不会超过INT限制,只需创建一个VIEW,将该列向上转换为BIGINT并对其进行查询。
答案 6 :(得分:0)
如果您使用的是SQL Server 2016,则可以对表和索引(如果有)启用压缩,然后可以将其作为元数据操作运行。如果您的表被压缩,则可以充分利用它。
1)如果它是压缩表,则查找任何其他非聚集索引。 2)您可以使用ROW或page压缩它们。与基本表相同的压缩不是强制性的。 3)一旦所有非聚集索引都被压缩,那么我们就可以使用Alter命令了。
我已经在公司完成此操作,并在博客中发布了该文章。 https://www.chiranjeevivamsydba.com/2020/07/how-to-make-datatype-change-to-run-as.html