0

すべてのアイテムを IDx から IDz に移動するストアド プロシージャを作成しました。そのため、移動する各行のデータをログに記録する必要があります。この手順では、行を ID< から IDz に問題なく移動します。ただし、情報をログに記録する必要がある場合は、移動された最後の行のみをログに記録します。私は何を間違っていますか?

これは私のコードです:

USE [TrackIT_Test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[MoveCustIDAndAlias] 
    -- Add the parameters for the stored procedure here
    @SourceAdrID int,
    @TargetAdrID int,
    @Username varchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    declare @custID varchar(50)
    set @custID = ''

    declare @alias varchar(50)
    set @alias = ''

    -- Insert statements for procedure here
    Select @custID = (CustID), @alias = (Alias) from dbo.Alias where AdrID = @SourceAdrID;
    Insert into dbo.AliasMoveLog (CustID, Alias, Username) VALUES (@custID, @alias, @Username);
    UPDATE dbo.Alias SET AdrID = @TargetAdrID WHERE  AdrID = @SourceAdrID;

誰でも助けることができますか?

4

2 に答える 2

2

はい、問題があります。

変数を使用していて、selectで変数値を設定すると、最後の行の値のみが格納されます。

あなたはそれを証明するためにこれを試すことができます:

CREATE TABLE tbl
(
    col1 INT
);
INSERT INTO tbl VALUES (1);
INSERT INTO tbl VALUES (2);
INSERT INTO tbl VALUES (3);

DECLARE @x int
SELECT @x = col1 FROM tbl
PRINT @x -- will print 3

あなたのspについては、この行を変更してみてください:

Select @custID = (CustID), @alias = (Alias) from dbo.Alias where AdrID = @SourceAdrID;
Insert into dbo.AliasMoveLog (CustID, Alias, Username) VALUES (@custID, @alias, @Username);

に:

Insert into dbo.AliasMoveLog (CustID, Alias, Username)
Select CustID, Alias, @Username from dbo.Alias where AdrID = @SourceAdrID;

詳細:SELECT @local_variable

于 2013-03-04T08:35:33.233 に答える
1

そのように変数を宣言すると、値を一括挿入することはできません。簡単な方法は、次のようにすることです。

INSERT INTO dbo.AliasMoveLog (CustID, Alias, Username)
SELECT CustID, Alias, @Username FROM dbo.Alias WHERE AdrID = @SourceAdrID;
于 2013-03-04T08:53:56.340 に答える