SQL server将int字段转换为bit

时间:2016-07-01 09:05:46

标签: sql sql-server sql-server-2014

我有一个大型数据库,我应该将其标准化。其中一个表包含类型"整数"但它只包含1和0值。因此,将此字段转换为位类型是很好的理由。但是,当我尝试在SQL Server Management Studio中保存更改时,它告诉我我无法执行此操作。此外,我有许多字段,其值为 nvarchar ,应转换为int或float,也应转换为int。

此外,我应该为所有更改创建迁移脚本,这样我就可以在不丢失数据的情况下更新真实数据库。也许有人知道有用的实用工具吗?

编辑:它告诉我,如果不放弃,我无法更新。我想更新表而不会丢失任何数据。

SQL版2014

5 个答案:

答案 0 :(得分:3)

    ---Create one Temp. Column
    Alter Table [dbo].[Demo2]
    Add tempId int

    GO

    --Copy Data in temp. Coulmn
    Update [dbo].[Demo2] set tempId=Id


    --Drop column which you want to modify
    Alter Table [dbo].[Demo2]
    Drop Column Id
    Go

    --Create again that column with bit type
    Alter Table [dbo].[Demo2]
    Add Id bit
    GO
    --copy date back
    Update [dbo].[Demo2] set Id=tempId

    --drop temp column
    Alter Table [dbo].[Demo2]
    Drop Column tempId

    Go

答案 1 :(得分:0)

以下是如何向表中添加新列,将该列设置为旧列,然后删除旧列

CREATE TABLE #test
(inttest int

)

Insert [#test]
        ( [inttest] )
Values  ( 0  
          )


Insert [#test]
        ( [inttest] )
Values  ( 1  
          )

Alter Table [#test] Add bittest bit

Update [#test] Set bittest=inttest

Alter Table [#test] Drop Column [inttest]

SELECT * FROM [#test] [T]

答案 2 :(得分:0)

要生成迁移脚本,您不需要特殊的实用程序,SSMS可以很好地完成它。

右键单击SSMS对象资源管理器中的表。在上下文菜单中选择Design项。更改列的类型。在主菜单Table Designer中,选择项Generate Change Script。将生成的脚本保存到文件中,检查它并确保在生产系统上运行它之前了解其中的每一行。如果需要,请调整脚本。

另一方面,要将列类型从int更改为bit,您可以使用ALTER TABLE语句:

ALTER TABLE dbo.TableName
ALTER COLUMN ColumnName bit NOT NULL

在运行此之前,您应该检查实际的int值是否确实只有0和1。

答案 3 :(得分:0)

在阅读完所有评论和帖子后,我在构建过程中找到了解决方案,该过程将转换所需的传递表和列。所以我写了这个函数

IF EXISTS (select * from dbo.sysobjects where id = object_id(N'IntToBit') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE IntToBit
GO


IF OBJECT_ID('convertion_table', 'U') IS NOT NULL
DROP TABLE dbo.convertion_table;
go

CREATE  TABLE dbo.convertion_table
(
    bitTypeColumn bit NOT NULL DEFAULT 0,
    intTypeColumnt integer ,
)
go

CREATE procedure IntToBit
@table nvarchar(150),
@column nvarchar(150)

AS
begin

DECLARE @sql nvarchar(4000)
SELECT @sql ='
    --copy data to temp table
    INSERT INTO convertion_table (bitTypeColumn)
    SELECT '+@column +'
    FROM ' +@table+'

    --Drop column which you want to modify
    Alter Table ' +@table+'
    Drop Column '+@column +'


    --Create again that column with bit type
    Alter Table ' +@table+'
    Add '+@column +' bit NOT NULL DEFAULT(0)

     --copy date back
    INSERT INTO '+@table+'('+@column+')
    SELECT bitTypeColumn
    FROM convertion_table

    --cleare temp table
    --DELETE bitTypeColumn FROM convertion_table 
    '
    exec sp_executesql @sql
end
GO 

然后调用它传递字段和表名:

exec dbo.IntToBit @table = 'tbl_SystemUsers', @column='intUseLogin';

特别感谢 Chris K Hitesh Thakor

答案 4 :(得分:0)

只需使用TSql脚本修改表而不是使用设计器

ALTER TABLE YourTableNameHere
ALTER COLUMN YourColumnNameHere INT 

如果您正在使用sql Server,那么您可能希望在更改表之前为表生成脚本,这样您就不会丢失任何数据..并且您只需使用脚本检索所有内容