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 值。
该表SpotArtSong您正试图插入一些记录至少有这些列:
您只是为 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)
| 归档时间: |
|
| 查看次数: |
495 次 |
| 最近记录: |