2013-05-17 74 views
0

我們繼承了一個數據庫,它有10米行,這樣的查詢,運行往往:MS SQL數據庫10米行,將varchar轉換爲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而不丟失任何數據,並且表格很大。

關於我們如何做到這一點的任何想法或建議?謝謝大家。

+5

如果這不是關鍵列,則將值轉換爲整數並更新爲新列。然後根據需要重命名它 – Prasanna

回答

1

這個工作,是原子(全有或全無)

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 
相關問題