我有一个包含电话号码的float类型列 - 我知道这很糟糕,所以我想将列从float转换为nvarchar(max),适当地转换数据以免丢失数据。
转换显然可以使用STR函数正确处理(建议here),但我不知道如何更改列类型并执行转换而不创建临时列。我不想使用临时列,因为我们将来会自动执行此操作,并且不希望遇到页面拆分对性能的影响(建议here)
在Postgres中,您可以在ALTER COLUMN语句中添加“USING”选项,指定如何转换现有数据。对于TSQL我找不到这样的东西。有没有办法可以做到这一点?
Postgres示例:
...ALTER COLUMN <column> TYPE <type> USING <func>(<column>);
答案 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
答案 1 :(得分:0)
不要在表中使用临时列,而是在临时表中使用(临时)列。简而言之:
如果表格很大,我建议分批进行。当然,如果表不是很大,那么担心页面拆分是不成熟的,因为在转换后完成表的完整重建及其索引会很便宜。另一个问题是:为什么nvarchar(max)?数据是电话号码。我上次检查时,电话号码相当短(当然小于nvarchar(max)可以容纳的2 Gb)和非unicode。做一些域建模来确定适当的数据大小,你以后会感谢我。最后,为什么你会“在将来自动多次”这样做?为什么没有正确的数据类型并插入正确的值?