Как написать действительное условие If внутри функции выбора или записи

У меня есть такая процедура, и я получаю ошибку в предложении If. Я думаю, что это потому, что COUNT. Но мое предложение должно быть таким, поэтому я не знаю, как его решить. Может быть, было бы хорошо, чтобы создать функцию или что-то подобное. Остальная часть кода в порядке

CREATE PROCEDURE DohvatiSveUgovore @zavodId int
    AS
    BEGIN
    DECLARE @TempUgovori TABLE
    (
         Id int,
         UstrojstvenaJedinica nvarchar(100),
         VrstaUgovora nvarchar(100),
         KlasaUgovora nvarchar(100),
         UrudzbeniBrojUgovora nvarchar(100),
         DatumPocetkaUgovora nvarchar(10),
         DatumIstekaUgovora nvarchar(10)
    )

    INSERT INTO @TempUgovori(Id, UstrojstvenaJedinica, VrstaUgovora, KlasaUgovora, UrudzbeniBrojUgovora, DatumPocetkaUgovora, DatumIstekaUgovora)
        SELECT 
        u.Id,
        ISNULL(STRING_AGG(LTRIM(RTRIM(z.SkraceniNaziv)), ', '), '') AS 'UstrojstvenaJedinica',
        vu.Naziv AS 'VrstaUgovora',
        ISNULL(u.KlasaUgovora, '') AS 'KlasaUgovora',
        ISNULL(u.UrudzbeniBrojUgovora, '') AS 'UrudzbeniBrojUgovora',
        (SELECT ISNULL(convert(varchar(10), u.DatumPocetkaUgovora, 104), '')) AS 'DatumPocetkaUgovora',
        (SELECT ISNULL(convert(varchar(10), u.DatumIstekaUgovora, 104), '')) AS 'DatumIstekaUgovora'
        FROM Ugovor AS u    
            LEFT JOIN VezaUgovorUstrojstvenaJedinica AS vuu
                ON u.Id = vuu.UgovorId
            INNER JOIN SifVrstaUgovora AS vu
                ON u.VrstaUgovoraId = vu.Id
            LEFT JOIN [TEST_MaticniPodaci2].hcphs.SifZavod AS z
                ON vuu.UstrojstvenaJedinicaId = z.Id                        

            if( (SELECT COUNT(UstrojstvenaJedinicaId)  FROM VezaUgovorUstrojstvenaJedinica WHERE UstrojstvenaJedinicaId =  'HCPHS') = 1)  
            begin
            (SELECT *  FROM  VezaUgovorUstrojstvenaJedinica WHERE UstrojstvenaJedinicaId =  'HCPHS')            
            end
            ELSE
            (SELECT * FROM  VezaUgovorUstrojstvenaJedinica WHERE  Isdeleted = 0  and UstrojstvenaJedinicaId = @zavodId)
            end 

ОШИБКА здесь, в Группе, и я не знаю почему.

GROUP BY u.Id, vu.Naziv, u.KlasaUgovora, u.UrudzbeniBrojUgovora, u.DatumPocetkaUgovora, u.DatumIstekaUgovora

            SELECT  
            tu.Id,
            tu.UstrojstvenaJedinica AS 'UstrojstvenaJedinica',
            tu.VrstaUgovora AS 'VrstaUgovora',
            tu.KlasaUgovora AS 'KlasaUgovora',
            tu.UrudzbeniBrojUgovora AS 'UrudzbeniBrojUgovora',
            tu.DatumIstekaUgovora AS 'DatumPocetkaUgovora',
            tu.DatumIstekaUgovora AS 'DatumIstekaUgovora',
            ISNULL(STRING_AGG(LTRIM(RTRIM(p.Naziv)), ', '), '') as 'Partner'
            FROM @TempUgovori AS tu
                LEFT JOIN VezaUgovorPartner AS vup
                    on tu.Id = vup.UgovorId
                LEFT JOIN [TEST_MaticniPodaci2].dbo.Partner as p
                    ON vup.PartnerId = p.PartnerID

            GROUP BY tu.Id, tu.UstrojstvenaJedinica, tu.VrstaUgovora, tu.KlasaUgovora, tu.UrudzbeniBrojUgovora, tu.DatumPocetkaUgovora, tu.DatumIstekaUgovora

        END


                EXEC [TEST_Ugovori_Prod].[dbo].[DohvatiSve] 6;  
                GO

Я прошу прощения за слишком много кода, но без него я не могу выполнить запрос.

1 ответ

Решение

Похоже, вы пытаетесь указать SQL Server присоединиться к VezaUgovorUstrojstvenaJedinica по-разному в зависимости от обстоятельств. Двигатель sql не может понять это. Для очень краткого обсуждения того, как sql оценивает запрос, вот начало:

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/70efeffe-76b9-4b7e-b4a1-ba53f5d21916/order-of-execution-of-sql-queries?forum=transactsql

Может быть, что-то подобное будет работать для вас?

CREATE PROCEDURE DohvatiSveUgovore @zavodId int
AS
BEGIN
DECLARE @TempUgovori TABLE
(
     Id int,
     UstrojstvenaJedinica nvarchar(100),
     VrstaUgovora nvarchar(100),
     KlasaUgovora nvarchar(100),
     UrudzbeniBrojUgovora nvarchar(100),
     DatumPocetkaUgovora nvarchar(10),
     DatumIstekaUgovora nvarchar(10)
);

DECLARE @HCPHS integer;
SELECT 
  @HCPHS = COUNT(UstrojstvenaJedinicaId)  
FROM 
  VezaUgovorUstrojstvenaJedinica 
WHERE 
  UstrojstvenaJedinicaId =  'HCPHS';

IF @HCPHS = 1
  INSERT INTO @TempUgovori(Id, UstrojstvenaJedinica, VrstaUgovora, KlasaUgovora, UrudzbeniBrojUgovora, DatumPocetkaUgovora, DatumIstekaUgovora)
      SELECT 
      u.Id,
      ISNULL(STRING_AGG(LTRIM(RTRIM(z.SkraceniNaziv)), ', '), '') AS 'UstrojstvenaJedinica',
      vu.Naziv AS 'VrstaUgovora',
      ISNULL(u.KlasaUgovora, '') AS 'KlasaUgovora',
      ISNULL(u.UrudzbeniBrojUgovora, '') AS 'UrudzbeniBrojUgovora',
      (SELECT ISNULL(convert(varchar(10), u.DatumPocetkaUgovora, 104), '')) AS 'DatumPocetkaUgovora',
      (SELECT ISNULL(convert(varchar(10), u.DatumIstekaUgovora, 104), '')) AS 'DatumIstekaUgovora'
      FROM Ugovor AS u    
          LEFT JOIN VezaUgovorUstrojstvenaJedinica AS vuu
              ON u.Id = vuu.UgovorId
          INNER JOIN SifVrstaUgovora AS vu
              ON u.VrstaUgovoraId = vu.Id
          LEFT JOIN [TEST_MaticniPodaci2].hcphs.SifZavod AS z
              ON vuu.UstrojstvenaJedinicaId = z.Id                        
          <JOIN OF SOME KIND>
          (SELECT *  FROM  VezaUgovorUstrojstvenaJedinica WHERE UstrojstvenaJedinicaId =  'HCPHS')            
            ON <SOME CRITERIA>
      GROUP BY u.Id, vu.Naziv, u.KlasaUgovora, u.UrudzbeniBrojUgovora, u.DatumPocetkaUgovora, u.DatumIstekaUgovora
ELSE
  INSERT INTO @TempUgovori(Id, UstrojstvenaJedinica, VrstaUgovora, KlasaUgovora, UrudzbeniBrojUgovora, DatumPocetkaUgovora, DatumIstekaUgovora)
      SELECT 
      u.Id,
      ISNULL(STRING_AGG(LTRIM(RTRIM(z.SkraceniNaziv)), ', '), '') AS 'UstrojstvenaJedinica',
      vu.Naziv AS 'VrstaUgovora',
      ISNULL(u.KlasaUgovora, '') AS 'KlasaUgovora',
      ISNULL(u.UrudzbeniBrojUgovora, '') AS 'UrudzbeniBrojUgovora',
      (SELECT ISNULL(convert(varchar(10), u.DatumPocetkaUgovora, 104), '')) AS 'DatumPocetkaUgovora',
      (SELECT ISNULL(convert(varchar(10), u.DatumIstekaUgovora, 104), '')) AS 'DatumIstekaUgovora'
      FROM Ugovor AS u    
          LEFT JOIN VezaUgovorUstrojstvenaJedinica AS vuu
              ON u.Id = vuu.UgovorId
          INNER JOIN SifVrstaUgovora AS vu
              ON u.VrstaUgovoraId = vu.Id
          LEFT JOIN [TEST_MaticniPodaci2].hcphs.SifZavod AS z
              ON vuu.UstrojstvenaJedinicaId = z.Id                        
          <JOIN OF SOME KIND>
          (SELECT * FROM  VezaUgovorUstrojstvenaJedinica WHERE  Isdeleted = 0  and UstrojstvenaJedinicaId = @zavodId)
            ON <SOME CRITERIA>
      GROUP BY u.Id, vu.Naziv, u.KlasaUgovora, u.UrudzbeniBrojUgovora, u.DatumPocetkaUgovora, u.DatumIstekaUgovora
Другие вопросы по тегам