SQL子查询返回了多个值

SQL子查询返回了多个值,sql,sql-server,Sql,Sql Server,我的查询导致以下错误: Msg 512,16级,状态1,程序项,第17行 子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时 查询: INSERT INTO [Total_Database].[dbo].[Item] ( ItemID, ItemNo, ItemDescription, Notes, StandardCost, SalesGLAccountID,

我的查询导致以下错误:

Msg 512,16级,状态1,程序项,第17行 子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时

查询:

INSERT INTO [Total_Database].[dbo].[Item]
    (
        ItemID, 
        ItemNo,
        ItemDescription,
        Notes,
        StandardCost,
        SalesGLAccountID,
        ItemTypeID,
        Backorderable
    ) 
 (
    SELECT  [nr],
            [nr],
            [Latijn]+' '+[Subgroep]+' '+CAST([nr] as VARCHAR(255)),
            [NL]+' '+[Vorm]+' '+[Kenmerk]+' '+[Hoogte],[Inkoopprijs],
            (4),
            (case when [Productgroep]='PB' then 1 else 5 end),
            (1) 
    FROM    [ACCESDATA].[dbo].[Planten]
 );

我怀疑会发生这种情况,因为我的子查询不包含WHERE,不幸的是,我不知道如何构造正确的WHERE子句。

如果确实只想插入一行,那么只需在末尾添加WHERE,后跟某个谓词逻辑语句,该语句仅对查询所读取的表中的一行为真

INSERT INTO [Total_Database].[dbo].[Item](ItemID,
    ItemNo,ItemDescription,Notes,StandardCost,SalesGLAccountID,
     ItemTypeID,Backorderable) 
SELECT  [nr],[nr],[Latijn]+' '+[Subgroep]+' '+CAST([nr] as VARCHAR(255)),
            [NL]+' '+[Vorm]+' '+[Kenmerk]+' '+[Hoogte],[Inkoopprijs],(4),
           (case when [Productgroep]='PB' then 1 else 5 end),(1) 
FROM  [ACCESDATA].[dbo].[Planten]
Where [SomeColumnName] = [some Value];  

。。。但是,当使用select执行Insert以生成要插入的行时,您只需键入select语句而不是Values子句,而不使用括号。我认为,因为您有周围的括号,查询处理器假设您希望它是一个单一的值。是否只插入一行数据?还是一整套数据行?

我怀疑问题出在您的:

看起来像是从Inserted中选择I.COGSGLAccountID,因为我返回了多行,所以您得到了一个错误

例如,您将inserted视为一行表,从中获取参数,如从inserted I中选择@ItemNo=I.ItemNo、@ItemDescription=I.ItemDescription,但inserted表可以有多行。所以在您的例子中,我认为您有3个选项-检查inserted中只有1行,将触发器重写为set-based,或者使用cursor


这里有一个类似的例子。

INSERT..SELECT在SELECT周围没有括号。括号使它成为一个子查询,这是不合适的。@rbaryyoung如果它是一个答案,那可能是一个很好的答案。@Ben,你在这个表上有触发器吗?@Ben:你能发布你的存储过程项吗?我怀疑您错误地识别了错误线路…对。一个触发器,这很容易成为问题。我喜欢一个完整的集合,我知道下面的方法是有效的:其中[nr]=“somenumber”;但是如果我删除WHERE并在不带括号或带括号的情况下执行查询,我将得到相同的错误。@Ben,这与标准SQL不一致,Insert应该可以与返回多行的Select一起正常工作。请在没有Where子句的情况下显示您正在使用的确切SQL,表明您遇到了错误。。。除非您的错误来自此表上的某个触发器,该触发器正试图使用包含此数据的子查询对另一个表执行某些操作,否则禁用该触发器将完成此任务。谢谢。在选择之前添加,然后它可以选择多表值。
INSERT INTO [Total_Database].[dbo].[Item]
    (
        ItemID, 
        ItemNo,
        ItemDescription,
        Notes,
        StandardCost,
        SalesGLAccountID,
        ItemTypeID,
        Backorderable
    ) IN
 (
    SELECT  [nr],
            [nr],
            [Latijn]+' '+[Subgroep]+' '+CAST([nr] as VARCHAR(255)),
            [NL]+' '+[Vorm]+' '+[Kenmerk]+' '+[Hoogte],[Inkoopprijs],
            (4),
            (case when [Productgroep]='PB' then 1 else 5 end),
            (1) 
    FROM    [ACCESDATA].[dbo].[Planten]
 );
INSERT INTO [Total_Database].[dbo].[Item]
    (
        ItemID, 
        ItemNo,
        ItemDescription,
        Notes,
        StandardCost,
        SalesGLAccountID,
        ItemTypeID,
        Backorderable
    ) IN
 (
    SELECT  [nr],
            [nr],
            [Latijn]+' '+[Subgroep]+' '+CAST([nr] as VARCHAR(255)),
            [NL]+' '+[Vorm]+' '+[Kenmerk]+' '+[Hoogte],[Inkoopprijs],
            (4),
            (case when [Productgroep]='PB' then 1 else 5 end),
            (1) 
    FROM    [ACCESDATA].[dbo].[Planten]
 );