INSERT 语句错误消息引用列我没有包含在查询中

chr*_*orn 1 sql-server-2008 sql-server

我正在使用 MSSQL 2008。

我的 INSERT 语句如下:

INSERT INTO [DB1].[dbo].[SpotArtSong](ID)
SELECT  SNG.S_ID
FROM [DB1].[dbo].[SpotArtSong] SPOT
INNER JOIN [DB2].[dbo].[nt-art] ART 
ON ART.Artist_Name LIKE SPOT.[Artist]+'%'
INNER JOIN [DB2].[dbo].[nt-sng] SNG 
ON ART.Artist_ID  = SNG.Artist_ID
AND left(SNG.SONG_TITLE,10) = left(SPOT.[Song],10)
WHERE spot.BDSID is NULL
Run Code Online (Sandbox Code Playgroud)

[DB1].[dbo].[SpotArtSong] 上的 [ID] 列有一些我试图替换的空值。我找到了替换项,在查看完整的列结果时,我对从 SNG.S_ID 返回的搜索结果感到满意。我正在尝试将该一列插入到 [DB1].[dbo].[SpotArtSong] 上的一列中。

本质上,我将一些数据报废到 [DB1].[dbo].[SpotArtSong] 中,并将其与 [DB2].[dbo].[nt-art] (ART) 和 [DB2] 之间的一些现有生产数据进行匹配.[dbo].[nt-sng] (SNG)。我知道 ART 和 SNG 中的数据是正确的,我正在将其与 SPOT 中报废的数据相关联

失败声明说:

Cannot insert the value NULL into column 'Artist', table 
'DB1.dbo.SpotArtSong'; column does not allow nulls. INSERT 
fails.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud)

我没有在那里插入任何东西,所以我不确定它为什么会失败。另外,如果我注释掉 insert 语句,select 语句不会返回任何 NULL 值。

EzL*_*zLo 7

该表SpotArtSong您正试图插入一些记录至少有这些列:

  • ID
  • 艺术家

您只是为 ID 提供一个值,但列Artist有一个NOT NULL约束。当您不为列提供值时(通过从INSERT列表中省略它),NULL除非有DEFAULT约束,否则默认插入。由于此列不允许NULL值,因此插入语句失败。

要么为该Artist列(以及任何其他列NOT NULL)提供一个值,要么更改该NOT NULL列的约束。

要提供艺术家姓名,请将Artist列名添加到INSERT并通过 提供值SELECT,如下所示:

INSERT INTO [DB1].[dbo].[SpotArtSong](
    ID,
    Artist)
SELECT  
    ID = SNG.S_ID,
    Artist = ART.Artist_Name
FROM 
    [DB1].[dbo].[SpotArtSong] SPOT
    INNER JOIN [DB2].[dbo].[nt-art] ART ON ART.Artist_Name LIKE SPOT.[Artist]+'%'
    INNER JOIN [DB2].[dbo].[nt-sng] SNG ON 
        ART.Artist_ID  = SNG.Artist_ID AND 
        left(SNG.SONG_TITLE,10) = left(SPOT.[Song],10)
WHERE 
    spot.BDSID is NULL
Run Code Online (Sandbox Code Playgroud)

要更改NOT NULL约束使用ALTER TABLE(注意NOT NULL末尾缺少):

ALTER TABLE [DB1].[dbo].[SpotArtSong] ALTER COLUMN Artist VARCHAR(100)
Run Code Online (Sandbox Code Playgroud)

虽然在我看来你实际上是在尝试做一个UPDATE而不是一个INSERT

UPDATE SPOT SET
    ID = SNG.S_ID
FROM 
    [DB1].[dbo].[SpotArtSong] SPOT
    INNER JOIN [DB2].[dbo].[nt-art] ART ON ART.Artist_Name LIKE SPOT.[Artist]+'%'
    INNER JOIN [DB2].[dbo].[nt-sng] SNG ON 
        ART.Artist_ID  = SNG.Artist_ID AND 
        left(SNG.SONG_TITLE,10) = left(SPOT.[Song],10)
WHERE 
    spot.BDSID is NULL
Run Code Online (Sandbox Code Playgroud)