我有一个大型数据库,我应该将其标准化。其中一个表包含类型"整数"但它只包含1和0值。因此,将此字段转换为位类型是很好的理由。但是,当我尝试在SQL Server Management Studio中保存更改时,它告诉我我无法执行此操作。此外,我有许多字段,其值为 nvarchar ,应转换为int或float,也应转换为int。
此外,我应该为所有更改创建迁移脚本,这样我就可以在不丢失数据的情况下更新真实数据库。也许有人知道有用的实用工具吗?
编辑:它告诉我,如果不放弃,我无法更新。我想更新表而不会丢失任何数据。
SQL版2014
答案 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,那么您可能希望在更改表之前为表生成脚本,这样您就不会丢失任何数据..并且您只需使用脚本检索所有内容