SQL server将整型字段转换为位
我有一个很大的数据库,我应该让它正常化。其中一个表包含类型为“integer”的字段,但它只包含1和0值。因此,将此字段转换为位类型是一个很好的理由。但是,当我尝试在SQLServerManagementStudio中保存更改时,它告诉我无法保存更改。我还有很多字段,它们的值像nvarchar应该转换成int,或者float也应该转换成int 此外,我应该为所有更改创建迁移脚本,以便在不丢失数据的情况下更新真实数据库。也许有人知道这个有用的工具 编辑:它告诉我,如果不删除它,我将无法更新。我想在不丢失任何数据的情况下更新表SQL server将整型字段转换为位,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我有一个很大的数据库,我应该让它正常化。其中一个表包含类型为“integer”的字段,但它只包含1和0值。因此,将此字段转换为位类型是一个很好的理由。但是,当我尝试在SQLServerManagementStudio中保存更改时,它告诉我无法保存更改。我还有很多字段,它们的值像nvarchar应该转换成int,或者float也应该转换成int 此外,我应该为所有更改创建迁移脚本,以便在不丢失数据的情况下更新真实数据库。也许有人知道这个有用的工具 编辑:它告诉我,如果不删除它,我将无法更新。我想在
SQL版本2014下面介绍如何向表中添加新列,将该列设置为旧列,然后删除旧列
---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
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]
要生成迁移脚本,您不需要特殊的实用程序,SSMS做得很好 在SSMS对象资源管理器中的表上单击鼠标右键。在关联菜单中选择
Design
项。更改列的类型。在主菜单表设计器中
选择项生成更改脚本
。将生成的脚本保存到一个文件中,在生产系统上运行它之前,检查它并确保理解其中的每一行。如果需要,调整脚本
另一方面,要将列类型从
int
更改为bit
,可以使用以下语句:
ALTER TABLE dbo.TableName
ALTER COLUMN ColumnName bit NOT NULL
在运行此程序之前,您应该检查实际的
int
值实际上仅为0和1。在阅读了我在构建过程中找到的所有注释和帖子后,该过程将转换所需的传递表和列。所以我写了这个函数
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只需使用TSql脚本修改表,而不必使用设计器
ALTER TABLE YourTableNameHere
ALTER COLUMN YourColumnNameHere INT
如果您使用的是sql Server,那么您可能希望在更改表之前为表生成脚本,这样您就不会丢失任何数据..而且您可以简单地使用脚本检索所有内容我希望sql Server management studio能给您一点指示,而不是简单地“做不到”。。。确切的错误是什么?您使用的是什么版本的SQL Server?如果您使用的是2012+,您可以使用
TRY\u CONVERT
来识别问题行-从TRY\u CONVERT(位,YourColumn)为空且YourColumn不为空的表中选择*代码>它真的告诉你“你做不到”吗?或者它提供了一个理由吗?你的最后一句话会导致你的问题被列为离题,因为你要求的是非现场资源。显示您尝试过的内容以及您遇到的问题,以便我们可以尝试修复它。我相信错误一定是因为它不会转换整个填充的列“即时”?您应该添加一个新的位列,将数据迁移到其中,删除旧列,然后根据需要重命名这个新列。如果错误不是上述错误,您应该在问题中添加更多信息。@MK_u也许您知道一些简化这项工作的程序?是的,这是一个很好的解决方案,但我有大约300个表,每个表包含大约2-3个非标准化字段。这将是非常长的时间,以od的一切手动。我读过关于“耳鼻喉科经理”的文章。它的工作原理与您在几次单击中编写的相同。但是我找不到这个program@dantey89对300个表进行更改并不是我会掉以轻心的事情!如果您想一次性完成这项工作,我建议您使用dynamic sql
填充更改并遍历您想要更改的表。我这样做了,但这表明我无法做到,因为不允许删除并重新创建表1)最好包含您需要的准确错误消息你的问题越来越难回答。2) 您需要以具有这些权限的用户身份登录才能进行此类更改。3) 第三方实用程序在这里帮不上忙。问题是我无论如何都做不到。我应该把所有数据都保存在安全的地方