如何在不删除SQL 2008中的表的情况下更改列

时间:2009-01-20 04:53:49

标签: sql-server sql-server-2008 column-types

为什么当我将列类型从int更改为real时,SQL 2008突然想要删除我的表?据我所知,这在SQL 2005中从未发生过。任何见解都会有所帮助。

5 个答案:

答案 0 :(得分:44)

我无法相信最高的答案已经在这里待了这么久 - 这是非常危险的建议!

您可以在不丢弃桌子的情况下进行几项操作:

如果您发现自己无法在不删除表的情况下更改列,则通常可以使用SELECT INTO查询将数据投影到新表中,然后删除旧表(暂时禁用)约束)然后重命名投影表。在这种情况下,您需要使数据库脱机以进行维护。

答案 1 :(得分:37)

在SQL Server 2008中,转到工具>>选项。在小窗口中,单击“Designer”。取消选中“防止保存需要...的更改”

=====

于2015年9月4日编辑。

我在很久很久以前就在这里添加了这个答案,描述了我将如何解决上述问题所描述的情况。从那以后,下面的线程中的用户已经以我当时推荐的方式暴露了一些关于做事的问题。基本上,我描述的解决方案在某些情况下可能会有问题。然后,我建议您继续阅读以检查其他用户的评论,并为您选择最佳解决方案。

答案 2 :(得分:34)

以下是我使用的内容:

-- Add new column
ALTER TABLE MyTable
ADD Description2 VARCHAR(MAX)
GO

-- Copy data to new column (probably with modifications)
Update MyTable
SET Description2 = Description
GO

-- Drop old column
ALTER TABLE MyTable
DROP COLUMN Description
GO

-- Rename new column to the original column's name.
sp_RENAME 'MyTable.Description2' , 'Description', 'COLUMN'
GO
  1. 将数据复制到新列中。
  2. 放下旧栏。
  3. 将新列重命名为旧列的名称。

答案 3 :(得分:0)

我有同样的问题。虽然如果我尝试使用其他sa帐户,我的帐户有权利。似乎某种程度上我的帐户无法改变。仍在调查,但这是一个许可问题。

更新

我无法解释它。但这就是我所做的。我的帐户属于两个域组。一个是新的AD域组,另一个是NT legay域组。删除旧域组后,我就能够成功更改表。请注意,这两个群体都有“sa”特权。

行为是alter命令会导致成功,但表上没有任何变化。然后,当我手动尝试通过设计器更改字段时,它抱怨说如果需要删除并重新创建表,我不允许进行更改。我找到了工具中的设置,我能够将其关闭。但这张桌子很大,并不是一个好主意。我建议其他人不要反对。

所以这是一个许可问题。我无法解释如何,但我希望它可以帮助其他人

答案 4 :(得分:0)

另一种不完全丢弃表格的方法是

  1. 备份列值。
  2. 如果列尚未允许空值,则使列可为空。将列值设置为null 做

    update tablename set columnname = null 
    
  3. 删除列
  4. 插入一个与已删除列名称相同的新列以及您想要的类型
  5. 将保存的数据插入此列