3

我的查询导致以下错误:

消息 512,级别 16,状态 1,过程 Item_insupd,第 17 行
子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。

询问:

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]
 );

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

4

3 回答 3

4

我怀疑问题出在这个字符串中(代码中的第 26 行):

IF NOT (EXISTS (SELECT G.GLAccountID FROM GLAccnt G INNER JOIN Inserted I ON G.GLAccountID = I.SalesGLAccountID))
OR ((SELECT I.COGSGLAccountID FROM Inserted I) IS NOT NULL) AND NOT (EXISTS (SELECT G.GLAccountID FROM GLAccnt G INNER JOIN Inserted I ON G.GLAccountID = I.COGSGLAccountID))

看起来(SELECT I.COGSGLAccountID FROM Inserted I)返回不止一行,所以你得到一个错误。

您将inserted其视为单行表(例如,您从中获取参数SELECT @ItemNo = I.ItemNo, @ItemDescription = I.ItemDescription FROM Inserted I,但inserted表可以有不止一行。所以在您的情况下,我认为您有 3 个选项 - 检查插入的行中是否只有 1 行,将触发器重写为基于集合,或使用游标。

这是带有一些类似示例的sql fiddle 。

于 2013-10-12T16:07:32.637 回答
0

如果您真的只想插入一行,那么您只需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()子句,而无需使用括号。我认为因为你有括号,查询处理器假设你希望它是一个单一的值。您只想插入一行数据吗?还是一整套数据行?

于 2013-10-12T15:50:48.430 回答
-1
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]
 );
于 2014-06-18T11:56:23.077 回答