-1

请参阅我之前仍然坚持的问题。 带有子查询的插入语句

我有 4 列需要处理,我无法删除表以将第 4 列从 int not null 更改为

我是从这个原始声明中得到指示的:

INSERT into ADVNET.dbo.KenCatItemTest
(categoryitemid,itemid,categoryid)
SELECT NEWID(),itemid,'0FCA508F-7EB5-4C2E-8803-DE688C4126E5'
FROM janel.dbo.item
WHERE janel.dbo.item.itemnumber like 'c-%' and listprice > 0

它抛出错误:

无法将值 NULL 插入列“LineSequence”、表“ADVNET.dbo.KenCatItemTest”;列不允许空值。插入失败。该语句已终止。

所以现在我正在看这个声明:

DECLARE @CategoryItemId uniqueidentifier;  
SET @CategoryItemId = NEWID();  
DECLARE @ItemID uniqueidentifier;  
SET @ItemId = (select itemid from janel.dbo.item
WHERE janel.dbo.item.itemnumber like 'c-%' and listprice > 0 );
DECLARE @CategoryID uniqueidentifier;
SET @CategoryID = '0FCA508F-7EB5-4C2E-8803-DE688C4126E5';
DECLARE @LineSequence int;
SELECT @LineSequence = ISNULL(MAX(LineSequence),0) + 1  
FROM KenCatItemTest WHERE CategoryId = @CategoryId;
INSERT INTO ADVNET.dbo.KenCatItemTest
(CategoryItemId, ItemId, CategoryId, LineSequence)
VALUES (@CategoryItemId, @ItemId, @CategoryId, @LineSequence)

这个新语句会引发错误:

子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。消息 515,级别 16,状态 2,第 5 行无法将值 NULL 插入列“ItemId”,表“ADVNET.dbo.KenCatItemTest”;列不允许空值。插入失败。该语句已终止。

4

2 回答 2

2

此语句导致问题:

SET @ItemId = (select itemid from janel.dbo.item
WHERE janel.dbo.item.itemnumber like 'c-%' and listprice > 0 );

如果满足条件的行不止一行,则将发生错误,因为该SET语句期望在右侧返回一个标量值而不是行集。

要修复它,您可以将条件缩小到仅返回单行的位置,或者执行诸如提取第一个值之类的操作。

例如:

SET @ItemId = (select TOP 1 itemid from janel.dbo.item
WHERE janel.dbo.item.itemnumber like 'c-%' and listprice > 0 );
于 2015-03-05T20:17:31.323 回答
1

你不能只使用 Row_number() 为 LineSequence 生成一个值吗?

    INSERT INTO ADVNET.dbo.KenCatItemTest(
           categoryitemid
          ,itemid
          ,categoryid
          ,LineSequence)
    SELECT 
           NEWID()
          ,itemid
          ,'0FCA508F-7EB5-4C2E-8803-DE688C4126E5'
          ,ROW_NUMBER() OVER(ORDER BY ItemId)
      FROM 
           janel.dbo.item i
     WHERE 
           i.itemnumber LIKE 'c-%' 
       AND listprice > 0
于 2015-03-06T01:20:56.510 回答