-1

私がまだ立ち往生している私の前の質問を見てください。 サブクエリを使用してステートメントを挿入する

対処する必要がある 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 を列 'LineSequence'、テーブル 'ADVNET.dbo.KenCatItemTest' に挿入できません。列はヌルを許可しません。INSERT は失敗します。ステートメントは終了されました。

だから今、私は代わりにこの声明を見ています:

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)

この新しいステートメントはエラーをスローします。

サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません。メッセージ 515、レベル 16、状態 2、行 5 値 NULL を列 'ItemId'、テーブル 'ADVNET.dbo.KenCatItemTest' に挿入できません。列はヌルを許可しません。INSERT は失敗します。ステートメントは終了されました。

4

2 に答える 2

2

このステートメントが問題を引き起こしています:

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

条件を満たす行が複数ある場合、SETステートメントは右側に行セットではなくスカラー値が返されることを想定しているため、エラーが発生します。

これを修正するには、基準を 1 行のみが返される場所に絞り込むか、最初の値を取得するなどの操作を実行します。

例えば:

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 に答える