我正在使用一个报告数据库,该数据库由SQL Server上的20个表组成。在市场营销表中,我有一个列report_date
,它当前是一个varchar(255)。它基本上是一个2017-12-12格式的日期。我想将此列的类型更改为日期。我正在运行此脚本,但收到错误。脚本如下:
USE [reporting].[dbo].[marketing]
GO
SELECT CONVERT(date, 'report_date');
这些是我得到的错误。
Msg 911,Level 16,State 1,Line 1 数据库'dbo'不存在。确保正确输入名称。
Msg 241,Level 16,State 1,Line 3 从字符串转换日期和/或时间时转换失败。
我该如何调整脚本?
答案 0 :(得分:4)
如果要更改列的数据类型(并且应该),则需要使用npm config set package-lock false
语句。您的第一条错误消息是因为alter table
指令 - 它应该是
USE
您的第二条错误消息是因为USE [reporting]
GO
是字符串常量,而不是列名。
select语句应为
'report_date'
请注意,如果您有一个无法转换为日期的值,则会再次出现第二个错误。
基本上我建议首先确保SELECT CAST(report_date as date) -- Don't use Convert without the style argument....
FROM [dbo].[marketing]
语句完成,没有任何例外,然后才改变表格:
select
答案 1 :(得分:1)
尝试:
SELECT CONVERT(DATE, report_date) --If only for comparison
ALTER TABLE marketing ALTER COLUMN report_date DATE --If want to change in the table
答案 2 :(得分:1)
这样做的正确方法就像;
ALTER TABLE reportin.dbo.marketing ALTER COLUMN'report_date'date
答案 3 :(得分:1)
"转换"用于在select查询中从一种数据类型转换为另一种数据类型,您需要使用alter语句来更改数据库列 USE [databasename]就足够了,所以在这里重写你的查询:
USE [reporting]
GO
ALTER TABLE marketing ALTER COLUMN ReportDate DATE
答案 4 :(得分:1)
缓慢但安全的方法是:
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。
在您执行任何操作之前,请确保使用此列的所有应用程序和代码都可以处理更改。
备注强>
您可能希望在更改后重建表/索引。