子查询在SQL SErver 2008中返回了多个值
请看我之前的问题,我仍然坚持 我有4列需要寻址,我无法删除表以将第4列从int not null更改为a 我是从这一原始声明中得到指示的:子查询在SQL SErver 2008中返回了多个值,sql,sql-server,sql-server-2008,tsql,scalar-subquery,Sql,Sql Server,Sql Server 2008,Tsql,Scalar Subquery,请看我之前的问题,我仍然坚持 我有4列需要寻址,我无法删除表以将第4列从int not null更改为a 我是从这一原始声明中得到指示的: INSERT into ADVNET.dbo.KenCatItemTest (categoryitemid,itemid,categoryid) SELECT NEWID(),itemid,'0FCA508F-7EB5-4C2E-8803-DE688C4126E5' FROM janel.dbo.item WHERE janel.dbo.item.itemn
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插入表“ADVNET.dbo.KenCatItemTest”的列“LineSequence”;列不允许空值。插入失败。
声明已终止
现在我看的是这句话:
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)
此新语句引发错误:
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。
Msg 515,16级,状态2,第5行
无法将值NULL插入表“ADVNET.dbo.KenCatItemTest”的列“ItemId”;列不允许空值。插入失败。
声明已终止
此语句导致了以下问题:
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 );
您能否不使用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
谢谢你,杰森·福克纳。但是,我如何才能完成将所有记录带过来并创建所有行的任务呢?也许我不应该使用标量变量?@KEN-Easist的方法是使用
光标
。无需光标进行插入。我在OP的代码中没有看到任何提示需要任何类型的循环的内容。@SeanLange-LineSequenceLineSequence
似乎必须为每一行手动递增。除此之外,还可以使用选择进入
。确保使用行号甚至理货表递增数字是毫无痛苦的。不需要求助于循环。