2016-07-01 3 views
0

Я создаю функцию, чтобы вернуть таблицу в SQL, но я не знаю, как именно создать функцию, моя функция на сейчас:Создайте функцию, чтобы вернуться за столом SQL

CREATE FUNCTION fn_PegaDetalhesDoPagador ( @IdLoteDet bigint) 
RETURNS TABLE 
(
    NomeSacado varchar(60), 
    CNPJSacado varchar(20), 
    Compromisso varchar(25) 
) 
AS 
RETURN 
(
    SELECT Sacados.NomeSac, 
     LoteDet.IdLoteDet, 
     LoteDet.NossoNum, 
     LoteDet.Comprom, 
     dbo.Sacados.CNPJ 
    FROM dbo.LoteDet INNER JOIN dbo.Sacados ON dbo.LoteDet.IDSac = dbo.Sacados.IDSac 
    WHERE [email protected] 

    IF @@ROWCOUNT = 0 
     BEGIN 
      SELECT Sacados.NomeSac, 
      LoteDetPg.IdLoteDet, 
      LoteDetPg.NossoNum, 
      LoteDetPg.Comprom, 
      dbo.Sacados.CNPJ 
      FROM dbo.LoteDetPg INNER JOIN dbo.Sacados ON dbo.LoteDetPg.IDSac = dbo.Sacados.IDSac 
      WHERE [email protected] 
      RETURN 
     END 
    else 
     RETURN 
) 

Что мне нужно, если выбор ничего не возвращает из таблицы LoteDet, мне нужно, чтобы функция сделала выбор в таблице LoteDetPg.

Это можно сделать с помощью этой функции?

Это можно сделать с помощью другого метода?

+1

If вы используете SSMS (любую версию), затем разверните Programmability \ Function, затем щелкните правой кнопкой мыши и выберите «New Multistatement ...» и используйте предоставленный шаблон. –

ответ

1

Попробуйте это:

CREATE FUNCTION fn_PegaDetalhesDoPagador (@IdLoteDet BIGINT) 
RETURNS @res TABLE 
(
    NomeSacado VARCHAR(60) , 
    IdLoteDet VARCHAR(MAX) ,--check this cols data type 
    NossoNum VARCHAR(MAX) ,--check this cols data type 
    Compromisso VARCHAR(25) , 
    CNPJSacado VARCHAR(20) 
) 
AS 
BEGIN 
    IF EXISTS (SELECT TOP 1 Sacados.NomeSac --better if you replace this with PK col 
       FROM dbo.LoteDet 
         INNER JOIN dbo.Sacados ON dbo.LoteDet.IDSac = dbo.Sacados.IDSac 
       WHERE idlotedet = @IdLoteDet) 
     BEGIN 
      INSERT INTO @res 
        SELECT Sacados.NomeSac , 
          LoteDet.IdLoteDet , 
          LoteDet.NossoNum , 
          LoteDet.Comprom , 
          dbo.Sacados.CNPJ 
        FROM dbo.LoteDet 
          INNER JOIN dbo.Sacados ON dbo.LoteDet.IDSac = dbo.Sacados.IDSac 
        WHERE IdLoteDet = @IdLoteDet; 
     END; 
    ELSE 
     BEGIN 
      INSERT INTO @res 
        SELECT Sacados.NomeSac , 
          LoteDetPg.IdLoteDet , 
          LoteDetPg.NossoNum , 
          LoteDetPg.Comprom , 
          dbo.Sacados.CNPJ 
        FROM dbo.LoteDetPg 
          INNER JOIN dbo.Sacados ON dbo.LoteDetPg.IDSac = dbo.Sacados.IDSac 
        WHERE IdLoteDet = @IdLoteDet; 
     END; 

    RETURN; 
END; 
0

Первый Выбор количества данных из LoteDet таблицы и сохраняет в переменной, если переменная счетчик не равен нулю, выборки данных из LoteDet в противном случае используйте LoteDetPg таблицу для извлечения данных