我正在使用一个报告数据库,该数据库由SQL Server上的20个表组成。在市场营销表中,我有一个report_date
列,目前是varchar(255)。它基本上是一个2017-12-12格式的日期。我想将此列的类型更改为日期。我正在运行此脚本,但收到错误。脚本如下:
USE [reporting].[dbo].[marketing]
GO
SELECT CONVERT(date, 'report_date');
这些是我得到的错误。
消息911,级别16,状态1,行1数据库'dbo'不存在。确保正确输入名称。
消息241,级别16,状态1,行3转换在从字符串转换日期和/或时间时失败。
我该如何调整脚本?
如果要更改列的数据类型(并且应该),则需要使用alter table
语句。您的第一条错误消息是因为USE
指令 - 它应该是
USE [reporting]
GO
您的第二条错误消息是因为'report_date'
是字符串常量,而不是列名。
select语句应该是
SELECT CAST(report_date as date) -- Don't use Convert without the style argument....
FROM [dbo].[marketing]
请注意,如果您有一个无法转换为日期的值,则会再次出现第二个错误。
基本上我建议首先确保select
语句完成没有任何异常,然后才改变表:
USE reporting
GO
ALTER TABLE [dbo].[marketing]
ALTER COLUMN report_date DATE
GO
试试这个:
SELECT CONVERT(DATE, report_date) --If only for comparison
ALTER TABLE marketing ALTER COLUMN report_date DATE --If want to change in the table
正确的方法是这样的;
ALTER TABLE reportin.dbo.marketing ALTER COLUMN'report_date'日期
你可以查看这个How do you change the datatype of a column in MS SQL?
“转换”用于在选择查询中从一种数据类型转换为另一种数据类型,您需要使用alter语句来更改数据库列,并且USE [databasename]就足够了,因此请在此处重写您的查询:
USE [reporting]
GO
ALTER TABLE marketing ALTER COLUMN ReportDate DATE
缓慢但安全的方法是:
ALTER TABLE dbo.MyTable ADD MyNewColumn DATE NULL;
)UPDATE dbo.MyTable SET MyNewColumn = CONVERT(DATE, MyColumn);
)ALTER TABLE dbo.MyTable DROP MyColumn;
) - 或者,您可以重命名此列并保持原样)EXEC sp_rename 'dbo.MyTable.MyNewColumn', 'MyColumn', 'COLUMN';
)您可能必须事先删除索引,但此方法(以及它的更改)有助于防止数据丢失。
如果在转换期间遇到错误,则应从更新中删除这些值(例如,添加WHERE子句)并手动调查它们。
如果您使用的是SQL Server 2012或更高版本,则可以使用TRY_CONVERT()
忽略无法转换为DATE的值。在这种情况下,新列中将包含NULL。
在执行任何操作之前,请确保使用此列的所有应用程序和代码都可以处理更改。
笔记
您可能希望在更改此类之后重建表/索引。