这里有一个现有的数据库,我正在用一个新的数据库构建一个新系统。
在那里,我需要将一些数据从旧数据库表传输到新数据库表。
我在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]
表中有其他列,如Note
是string
,Status
是bool
,CreateBy
是int
,CreateDate
是DateTime
。因此,当我运行查询时,它返回错误
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
因此,我想知道如何从我编写的上述脚本中为CreateDate、CreateBy和Notes插入数据。
如果目标表具有不可为null且没有默认值的列,则在插入数据时必须为这些字段指定值。
最简单的解决方案是修改目标表,为这些字段添加DEFAULT值,例如SYSDATETIME()
用于Created
,SYSTEM_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)
值的形式返回当前时间。如果Created
是DATETIMEOFFSET
,则应使用SYSDATETIMEOFFSET。
您可以为[Mondo UAT]中的CreateDate、CreateBy、Notes列设置默认值。[dbo]。[国家]表,如果它们不是空列。因此,当您将数据插入表中而不为这些列插入值时,将插入默认值。