2010-05-09 5 views
0

je demandais b4 à propos de permutation requête pour échanger des données entre les lignes dans une même table et je suis arrivé à cette requêteéchanger des données SQL Server entre les lignes des problèmes

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 

Cette requête prend 2 paramètres et swapping toutes les lignes retournées pour chaque paramètre.

Le problème est l'échange de requêtes juste si chaque paramètre (clé étrangère) a des valeurs J'ai besoin de faire un échange si l'un d'eux n'a pas de valeur.

J'espère que quelqu'un peut m'aider dans cela.

Merci,

Répondre

0

Je l'ai

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 
Questions connexes