2010-05-09 68 views
0

我問交換查詢在同一錶行之間交換數據B4得到了查詢SQL服務器交換數據

ALTER PROCEDURE [dbo].[VehicleReservationsSwap] 
    (@FirstVehicleID int, 
    @secondVehicleID int, 
    @WhereClause nvarchar(2000)) 
AS 
BEGIN 
    Create Table #Temp (VehicleID int, 
         VehicleType nvarchar(100), 
         JoinId int) 

    DECLARE @SQL varchar(8000) 

    SET @SQL = 'Insert into #Temp (VehicleID, VehicleType, JoinId) SELECT 
     VehicleID,VehicleType,CASE WHEN VehicleID = ' + Cast(@FirstVehicleID as varchar(10)) + ' then ' + Cast(@secondVehicleID as varchar(10)) + ' ELSE ' + Cast(@FirstVehicleID as varchar(10)) + ' END AS JoinId 
     FROM Reservations 
     WHERE VehicleID in (' + Cast(@FirstVehicleID as varchar(10)) + ' , ' + Cast(@secondVehicleID as varchar(10)) + ')' + @WhereClause 

    EXEC(@SQL) 

    --swap values 
    UPDATE y 
    SET y.VehicleID = #Temp.VehicleID, 
     y.VehicleType = #Temp.VehicleType 
    FROM Reservations y 
    INNER JOIN #Temp ON y.VehicleID = #Temp.JoinId 
    WHERE y.VehicleID in (@FirstVehicleID, @SecondVehicleID) 

    Drop Table #Temp 
END 

此查詢需要兩個參數,並交換所有行返回每參數。

問題是,如果每個參數(外鍵)的值都是查詢交換 如果其中一個沒有值,我需要進行交換。

我希望有人能幫助我。

感謝,

回答

0

我得到了它

ALTER PROCEDURE [dbo].[VehicleReservationsSwap] 
    -- Add the parameters for the stored procedure here 
    (@FirstVehicleID int, 
    @secondVehicleID int, 
    @WhereClause nvarchar(2000)) 
AS 
BEGIN 

Create Table #Temp 
(
    VehicleID int 
    ,VehicleType nvarchar(100) 
    ,JoinId int 
) 


DECLARE @SQL varchar(8000) 
SET @SQL ='Insert into #Temp (VehicleID,VehicleType,JoinId) SELECT 
     VehicleID,VehicleType,CASE WHEN VehicleID = ' + Cast(@FirstVehicleID as varchar(10)) + ' then ' + Cast(@secondVehicleID as varchar(10)) + ' ELSE ' + Cast(@FirstVehicleID as varchar(10)) + ' END AS JoinId 
     FROM Reservations 
     WHERE VehicleID in (' + Cast(@FirstVehicleID as varchar(10)) + ' , ' + Cast(@secondVehicleID as varchar(10)) + ')' + @WhereClause 
EXEC(@SQL) 

--swap values 
declare @count1 int 
declare @count2 int 
set @count1 = (select COUNT(reservationid) as count1 from Reservations where VehicleID = @FirstVehicleID) 
set @count2 = (select COUNT(reservationid) as count2 from Reservations where VehicleID = @secondVehicleID) 

if @count1 > 0 and @count2 > 0 
begin 
    UPDATE y 
    SET y.VehicleID = #Temp.VehicleID 
     ,y.VehicleType = #Temp.VehicleType 
    FROM Reservations  y 
     INNER JOIN #Temp ON y.VehicleID = #Temp.JoinId 
    WHERE y.VehicleID in (@FirstVehicleID,@secondVehicleID)  
end 
else if @count1 <= 0 and @count2 > 0 
begin 
    UPDATE y 
    SET y.VehicleID = #Temp.JoinId 
     ,y.VehicleType = #Temp.VehicleType 
    FROM Reservations  y 
     INNER JOIN #Temp ON y.VehicleID = #Temp.VehicleID 
    WHERE y.VehicleID = @secondVehicleID  
end 
else if @count1 > 0 and @count2 <= 0 
begin 
    UPDATE y 
    SET y.VehicleID = #Temp.JoinId 
     ,y.VehicleType = #Temp.VehicleType 
    FROM Reservations  y 
     INNER JOIN #Temp ON y.VehicleID = #Temp.VehicleID 
    WHERE y.VehicleID = @FirstVehicleID  
end 

Drop Table #Temp 


END