2013-03-05 3 views
0

Я использую SQL Server 2008 R2 я имею процедуру магазина, как это:SQL выберите сазе

CREATE PROCEDURE Get_Code_Tourne_Matin 
    -- Add the parameters for the stored procedure here 
@The_FA int, 
@The_Jour int, 
@The_Insee varchar(10) 
AS 
BEGIN 
declare @TheCode varchar(250) 


set @TheCode = case 
    when exists (SELECT T_TOURNE_LABEL.LIBELLE 
        FROM TOURNE 
        LEFT JOIN T_TOURNE_LABEL ON TOURNE.LIB_TOURNE = T_TOURNE_LABEL.NOID 
        WHERE THE_FA = @The_FA AND 
         NO_INSEE = @The_Insee AND 
         JOUR = @The_Jour AND 
         (datepart(hh, LE_HEURE) between 13 and 23 or datepart(hh, LE_HEURE) between 0 and 6)) then LIBELLE 
    when exists (SELECT LIBELLE 
        FROM TOURNE 
        LEFT JOIN T_TOURNE_LABEL ON TOURNE.LIB_TOURNE = T_TOURNE_LABEL.NOID 
        WHERE THE_FA = @The_FA AND 
         NO_INSEE = @The_Insee AND 
         JOUR = 0 AND 
         (datepart(hh, LE_HEURE) between 13 and 23 or datepart(hh, LE_HEURE) between 0 and 6)) then LIBELLE 
    else '00' 


    end 


RETURN @TheCode 
END 

я просто хочу, чтобы вернуть Libelle.
первого выбора с 3 переменными, когда он нашел то Retrun в Libelle
еще при запуске выберите с 2 переменными, когда он нашел то Retrun в Libelle
еще Retrun «00»

, кажется, ошибка синтаксиса на Libelle

любая идея?

+0

Libelle существует только внутри() скобки, но вы пытаетесь получить доступ к нему за их пределами. –

+0

Если есть строка, которая соответствует верхней выберите (с 'JOUR = @ The_Jour'), могло быть строка с 'JOUR = 0'? –

ответ

3

Я думаю, что-то вроде:

set @TheCode = COALESCE(
(SELECT TOP 1 T_TOURNE_LABEL.LIBELLE 
        FROM TOURNE 
        LEFT JOIN T_TOURNE_LABEL ON TOURNE.LIB_TOURNE = T_TOURNE_LABEL.NOID 
        WHERE THE_FA = @The_FA AND 
         NO_INSEE = @The_Insee AND 
         (JOUR = @The_Jour OR JOUR = 0) AND 
         (datepart(hh, LE_HEURE) between 13 and 23 or datepart(hh, LE_HEURE) between 0 and 6) 
ORDER BY JOUR DESC), '00') 

должно охватывать все ваши дела. (Если не может быть две соответствующие строки из вашего запроса, где один имеет JOUR = @The_Jour, а другой имеет JOUR = 0, то вы можете удалить TOP 1 и ORDER BY положения (обратите внимание, что я предполагал, что любое возможное @The_Jour значение> 0)

0
set @TheCode =( SELECT ISNULL((SELECT TOP 1 T_TOURNE_LABEL.LIBELLE 
       FROM TOURNE 
       LEFT JOIN T_TOURNE_LABEL ON TOURNE.LIB_TOURNE = T_TOURNE_LABEL.NOID 
       WHERE THE_FA = @The_FA AND NO_INSEE = @The_Insee AND JOUR = @The_Jour 
           AND (DATEPART(hh, LE_HEURE) BETWEEN 13 AND 23 
           OR DATEPART(hh, LE_HEURE) BETWEEN 0 AND 6 
           )), '00') AS LIBELLE 
0
CREATE PROCEDURE Get_Code_Tourne_Matin 
@The_FA int, 
@The_Jour int, 
@The_Insee varchar(10) 
AS 
BEGIN 
declare @TheCode varchar(250) 
    Set @TheCode = ''; 
    SELECT top 1 @TheCode = T_TOURNE_LABEL.LIBELLE 
      FROM TOURNE 
      LEFT JOIN T_TOURNE_LABEL ON TOURNE.LIB_TOURNE = T_TOURNE_LABEL.NOID 
      WHERE THE_FA = @The_FA AND 
       NO_INSEE = @The_Insee AND 
       (JOUR = @The_Jour or JOUR = 0)AND 
       (datepart(hh, LE_HEURE) between 13 and 23 or datepart(hh, LE_HEURE) between 0 and 6) 

    set @TheCode = case 
     when len(@TheCode) > 0 
     when exists (SELECT @TheCode) 
     else '00' 

     end 
    RETURN @TheCode 
END 
Смежные вопросы