如何在 select 内编写有效的 If 子句或编写函数

How to write valid If clause inside select or write function

我有这样的程序,但在 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 中出现错误,我不知道为什么。

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

很抱歉代码太多,但没有它我无法运行查询。

您似乎在尝试告诉 SQL 服务器根据不同的情况加入 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