在不可为null的Datetime字段中插入缺少的日期



这里有一个现有的数据库,我正在用一个新的数据库构建一个新系统。

在那里,我需要将一些数据从旧数据库表传输到新数据库表。

我在SQL 中编写了这个查询

INSERT INTO [Mondo-UAT].[dbo].[Countries] (
[Country_Name]
,[Country_Code]
,[Note]

)
SELECT [Code1]
,[Code3]
,[Name]

FROM  [MondoErp-UAT].[dbo].[Nations] 

问题是在[Mondo-UAT].[dbo].[Countries]表中有其他列,如NotestringStatusboolCreateByintCreateDateDateTime。因此,当我运行查询时,它返回错误

Msg 515, Level 16, State 2, Line 8 Cannot insert the value NULL into column 'CreatedDate', table 'Mondo-UAT.dbo.Countries'; column does not allow nulls. INSERT fails. The statement has been terminated

因此,我想知道如何从我编写的上述脚本中为CreateDateCreateByNotes插入数据。

如果目标表具有不可为null且没有默认值的列,则在插入数据时必须为这些字段指定值。

最简单的解决方案是修改目标表,为这些字段添加DEFAULT值,例如SYSDATETIME()用于CreatedSYSTEM_USER用于CreatedBy''用于Notes。对于Status,您必须决定什么是好的默认状态。0可能有意义,也可能没有意义。

否则,必须在查询中指定这些值:

INSERT INTO [Mondo-UAT].[dbo].[Countries] (
[Country_Name]
,[Country_Code]
,[Note]
, Created
, CreatedBy
, Status
)
SELECT [Code1]
,[Code3]
,[Name]
, SYSDATETIME()
, SYSTEM_USER
, 0
FROM  [MondoErp-UAT].[dbo].[Nations] 

SYSTEM_USER返回当前用户的登录名,无论是Windows还是SQL Server登录名。这使得它成为用户列的一个很好的默认值。

SYSDATETIME以DATETIME2(7)值的形式返回当前时间。如果CreatedDATETIMEOFFSET,则应使用SYSDATETIMEOFFSET。

您可以为[Mondo UAT]中的CreateDate、CreateBy、Notes列设置默认值。[dbo]。[国家]表,如果它们不是空列。因此,当您将数据插入表中而不为这些列插入值时,将插入默认值。

最新更新