Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
子查询在SQL SErver 2008中返回了多个值_Sql_Sql Server_Sql Server 2008_Tsql_Scalar Subquery - Fatal编程技术网

子查询在SQL SErver 2008中返回了多个值

子查询在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

请看我之前的问题,我仍然坚持

我有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.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-LineSequence
LineSequence
似乎必须为每一行手动递增。除此之外,还可以使用
选择进入
。确保使用行号甚至理货表递增数字是毫无痛苦的。不需要求助于循环。