Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL server将整型字段转换为位_Sql_Sql Server_Sql Server 2014 - Fatal编程技术网

SQL server将整型字段转换为位

SQL server将整型字段转换为位,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我有一个很大的数据库,我应该让它正常化。其中一个表包含类型为“integer”的字段,但它只包含1和0值。因此,将此字段转换为位类型是一个很好的理由。但是,当我尝试在SQLServerManagementStudio中保存更改时,它告诉我无法保存更改。我还有很多字段,它们的值像nvarchar应该转换成int,或者float也应该转换成int 此外,我应该为所有更改创建迁移脚本,以便在不丢失数据的情况下更新真实数据库。也许有人知道这个有用的工具 编辑:它告诉我,如果不删除它,我将无法更新。我想在

我有一个很大的数据库,我应该让它正常化。其中一个表包含类型为“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 KHitesh 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) 第三方实用程序在这里帮不上忙。问题是我无论如何都做不到。我应该把所有数据都保存在安全的地方