MS SQL数据库,具有10m行,将列上的varchar转换为int
我们继承了一个数据库,它有1000万行和这样一个经常运行的查询:MS SQL数据库,具有10m行,将列上的varchar转换为int,sql,sql-server,azure,azure-sql-database,Sql,Sql Server,Azure,Azure Sql Database,我们继承了一个数据库,它有1000万行和这样一个经常运行的查询: SELECT SUM(CONVERT(INT,numSeconds)) AS total_dwell from [dbo].[Orders] where category='Shoes' AND CONVERT(INT,numSeconds)<300 numSeconds是一个整数,数字从0到2000,但列类型是nvarchar-我们需要在不丢失任何数据的情况下转换为INT,并且表非常庞大 关于我们如何做到这一点,有什么
SELECT SUM(CONVERT(INT,numSeconds)) AS total_dwell from [dbo].[Orders]
where category='Shoes' AND CONVERT(INT,numSeconds)<300
numSeconds是一个整数,数字从0到2000,但列类型是nvarchar-我们需要在不丢失任何数据的情况下转换为INT,并且表非常庞大
关于我们如何做到这一点,有什么想法或建议吗?谢谢大家。这是可行的,要么全有要么全无
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Ooopsie]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
DROP TABLE [dbo].[Ooopsie]
END
GO
CREATE TABLE [dbo].[Ooopsie] (
[OoopsieKey] [smallint] not null
, OoopsieColumn varchar(64) not null
)
GO
IF EXISTS ( SELECT TABLE_SCHEMA , TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Ooopsie' and TABLE_SCHEMA = 'dbo' )
BEGIN
IF EXISTS
(
SELECT *
FROM [INFORMATION_SCHEMA].[COLUMNS]
WHERE
TABLE_NAME = 'Ooopsie'
AND TABLE_SCHEMA = 'dbo'
AND COLUMN_NAME = 'OoopsieColumn'
and DATA_TYPE != 'int'
)
BEGIN
ALTER TABLE [dbo].[Ooopsie]
ALTER COLUMN [OoopsieColumn] int NOT NULL;
END
END
GO
-----编辑
下面的方法可行,但不是原子的。如果更新失败,你就完了
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Ooopsie]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
DROP TABLE [dbo].[Ooopsie]
END
GO
CREATE TABLE [dbo].[Ooopsie] (
[OoopsieKey] [smallint] not null
, OoopsieColumn varchar(64) not null
)
GO
IF EXISTS ( SELECT TABLE_SCHEMA , TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Ooopsie' and TABLE_SCHEMA = 'dbo' )
BEGIN
IF NOT EXISTS
(
SELECT *
FROM [INFORMATION_SCHEMA].[COLUMNS]
WHERE
TABLE_NAME = 'Ooopsie'
AND TABLE_SCHEMA = 'dbo'
AND COLUMN_NAME = 'OoopsieInt'
)
BEGIN
ALTER TABLE [dbo].[Ooopsie]
ADD [OoopsieInt] int NOT NULL;
END
END
GO
IF EXISTS
(
SELECT *
FROM [INFORMATION_SCHEMA].[COLUMNS]
WHERE
TABLE_NAME = 'Ooopsie'
AND TABLE_SCHEMA = 'dbo'
AND COLUMN_NAME = 'OoopsieInt'
)
BEGIN
Update dbo.Ooopsie Set OoopsieInt = convert (int , OoopsieColumn)
END
GO
IF EXISTS
(
SELECT *
FROM [INFORMATION_SCHEMA].[COLUMNS]
WHERE
TABLE_NAME = 'Ooopsie'
AND TABLE_SCHEMA = 'dbo'
AND COLUMN_NAME = 'OoopsieColumn'
)
BEGIN
ALTER TABLE [dbo].[Ooopsie]
DROP COLUMN [OoopsieColumn];
END
GO
IF EXISTS
(
SELECT *
FROM [INFORMATION_SCHEMA].[COLUMNS]
WHERE
TABLE_NAME = 'Ooopsie'
AND TABLE_SCHEMA = 'dbo'
AND COLUMN_NAME = 'OoopsieInt'
)
BEGIN
EXEC sp_rename
@objname = 'Ooopsie.OoopsieInt',
@newname = 'OoopsieColumn',
@objtype = 'COLUMN'
END
GO
如果这不是键列,请将值转换为整数并更新为新列。然后根据需要重命名它