更改列:指定转换功能的选项?

时间:2014-02-06 04:19:48

标签: sql-server tsql

我有一个包含电话号码的float类型列 - 我知道这很糟糕,所以我想将列从float转换为nvarchar(max),适当地转换数据以免丢失数据。

转换显然可以使用STR函数正确处理(建议here),但我不知道如何更改列类型并执行转换而不创建临时列。我不想使用临时列,因为我们将来会自动执行此操作,并且不希望遇到页面拆分对性能的影响(建议here

在Postgres中,您可以在ALTER COLUMN语句中添加“USING”选项,指定如何转换现有数据。对于TSQL我找不到这样的东西。有没有办法可以做到这一点?

Postgres示例:

...ALTER COLUMN <column> TYPE <type> USING <func>(<column>);

2 个答案:

答案 0 :(得分:0)

在sql Server中:

CREATE TABLE dbo.Employee
(
EmployeeID INT IDENTITY (1,1) NOT NULL
,FirstName VARCHAR(50) NULL
,MiddleName VARCHAR(50) NULL
,LastName VARCHAR(50) NULL
,DateHired datetime NOT NULL
)

-- Change the datatype to support 100 characters and make NOT NULL
ALTER TABLE dbo.Employee
ALTER COLUMN FirstName VARCHAR(100) NOT NULL

-- Change datatype and allow NULLs for DateHired
ALTER TABLE dbo.Employee
ALTER COLUMN DateHired SMALLDATETIME NULL

-- Set SPARSE columns for Middle Name (sql server 2008 only)
ALTER TABLE dbo.Employee
ALTER COLUMN MiddleName VARCHAR(100) SPARSE NULL

http://sqlserverplanet.com/ddl/alter-table-alter-column

答案 1 :(得分:0)

不要在表中使用临时列,而是在临时表中使用(临时)列。简而言之:

  1. 使用您想要更改的表+列的PK创建临时表(当然,使用正确的数据类型)
  2. 使用转换方法将数据选择到临时表中
  3. 更改实际表格中的数据类型
  4. 从临时表值更新实际表
  5. 如果表格很大,我建议分批进行。当然,如果表不是很大,那么担心页面拆分是不成熟的,因为在转换后完成表的完整重建及其索引会很便宜。另一个问题是:为什么nvarchar(max)?数据是电话号码。我上次检查时,电话号码相当短(当然小于nvarchar(max)可以容纳的2 Gb)和非unicode。做一些域建模来确定适当的数据大小,你以后会感谢我。最后,为什么你会“在将来自动多次”这样做?为什么没有正确的数据类型并插入正确的值?