2013-03-04 102 views
0

我已經創建了一個存儲過程來將IDx中的所有項目移動到IDz,因爲它必須記錄它移動的每一行的一些數據。該過程將行ID <移動到IDz沒有任何問題。但是當它必須記錄信息時,它只記錄最後一行被移動的行。我究竟做錯了什麼?MSSQL服務器僅插入最後一行的存儲過程

這是我的代碼:

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; 

誰能幫助?

回答

1

是的,我看到你的問題。

當您使用變量並通過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

+0

越來越「近關鍵字的語法不正確選擇」,試圖以驗證您的解決方案 – Lahib 2013-03-04 08:42:18

+1

對不起,只是刪除了'VALUES'在INSERT語句後..我已經編輯我的答案.. – 2013-03-04 08:46:16

+0

抱歉,我的壞,有值關鍵字仍然插入。現在工作很好。謝謝你的幫助 – Lahib 2013-03-04 08:46:35

1

那麼一旦你聲明這樣的變量,你就無法批量插入值。 簡單的方法就是做這種方式:

INSERT INTO dbo.AliasMoveLog (CustID, Alias, Username) 
SELECT CustID, Alias, @Username FROM dbo.Alias WHERE AdrID = @SourceAdrID;