• I am sorry to disagree with my collegues, but your cursor progression was correct.  If you comment out references to your tables and put simple statements in instead you will see that the loop generates output for each value:


    DECLARE @profileName nvarchar(200);
    DECLARE @hierarchyFlag tinyint;
    DECLARE @db_cursor CURSOR;
    DECLARE @ProfileNameTable TABLE (ProfileName nvarchar(100));
    INSERT INTO @ProfileNameTable (ProfileName)
    /*SELECT CASE WHEN Code like '%S%' AND ProfileName NOT LIKE '%STUDENT%' THEN CONCAT(LTRIM(RTRIM(ProfileName)), '_STUDENT')
    ELSE LTRIM(RTRIM(ProfileName)) END AS ProfileName FROM [dbo].[Users_Exceptions] WHERE replace(ltrim(replace(Code, '0', ' ')), ' ', '0') = @Code AND ProfileName IS NOT NULL
    UNION
    SELECT ProfileName AS ProfileName FROM [dbo].[vProfile] WHERE replace(ltrim(replace(Code, '0', ' ')), ' ', '0') = @Code AND ProfileName IS NOT NULL AND OraUser IS NOT NULL*/
    VALUES ('Profile 1'), ('Profile 2');
    /*
    SET @db_cursor = CURSOR FOR
    SELECT a.ProfileName FROM
        (SELECT HibisProfileName AS ProfileName FROM [dbo].[vSB_IdM_Hibis_Profile] WHERE replace(ltrim(replace(Code, '0', ' ')), ' ', '0') = @Code AND HibisProfileName IS NOT NULL AND OraUser IS NOT NULL
       UNION
       SELECT CASE WHEN Code like '%S%' AND ProfileName NOT LIKE '%STUDENT%' THEN CONCAT(LTRIM(RTRIM(ProfileName)), '_STUDENT')
            ELSE LTRIM(RTRIM(ProfileName)) END AS ProfileName FROM [dbo].[SB_Hibis_Users_Exceptions] WHERE replace(ltrim(replace(Code, '0', ' ')), ' ', '0') = @Code AND ProfileName IS NOT NULL) a;
    */
    SET @db_cursor  = CURSOR FOR
    SELECT ProfileName FROM @ProfileNameTable

    OPEN @db_cursor;
    FETCH NEXT FROM @db_cursor INTO @profileName;
    WHILE @@FETCH_STATUS = 0
    BEGIN
      
    PRINT @profileName
    /*    SET @hierarchyFlag = (SELECT TOP 1 HierarchyFlag FROM [dbo].[vSB_IdM_Hibis_Profile] WHERE ltrim(rtrim(HibisProfileName)) = @profileName AND HierarchyFlag IS NOT NULL);
       IF (@hierarchyFlag = 1)
            BEGIN
              SELECT 'insert into ban_nad (OP,NADREJEN,VODJA) VALUES (''' +replace(ltrim(replace(a.Code, '0', ' ')), ' ', '0')+''',''' +replace(ltrim(replace(b.Code, '0', ' ')), ' ', '0')+''',''0'');'
              FROM [dbo].[vProfile] a, [dbo].[vProfile] b
              WHERE  a.Code <> b.Code AND ISNULL(@profileName, 'A') = ISNULL(b.HibisProfileName, 'A')  AND replace(ltrim(replace(a.Code, '0', ' ')), ' ', '0') = @Code
              UNION
                SELECT 'insert into ban_nad (OP,NADREJEN,VODJA) VALUES (''' +replace(ltrim(replace(b.Code, '0', ' ')), ' ', '0')+''',''' +replace(ltrim(replace(a.code, '0', ' ')), ' ', '0')+''',''0'');'
             FROM [dbo].[vProfile] a, [dbo].[vProfile] b
              WHERE a.Code <> b.Code AND ISNULL(@profileName, 'A') = ISNULL(b.HibisProfileName, 'A')  AND replace(ltrim(replace(a.Code, '0', ' ')), ' ', '0') = @Code
              UNION
              SELECT 'insert into ban_nad (OP,NADREJEN,VODJA) VALUES (''' +replace(ltrim(replace(dv.Code, '0', ' ')), ' ', '0')+''',null,''1'');'
              FROM [dbo].[vProfile] dv
              WHERE  replace(ltrim(replace(dv.Code, '0', ' ')), ' ', '0') = @Code
              UNION
              SELECT 'insert into ban_nad (OP,NADREJEN,VODJA) VALUES (''' +replace(ltrim(replace(b.OP, '0', ' ')), ' ', '0')+''',''' +replace(ltrim(replace(a.code, '0', ' ')), ' ', '0')+''',''0'');'
              FROM [dbo].[vProfile] a, [dbo].[Hierarchy_Ex] b
                WHERE ISNULL(@profileName, 'A') = ISNULL(b.PROFILENAME, 'B')  AND replace(ltrim(replace(a.Code, '0', ' ')), ' ', '0') = @Code
          END
      ELSE IF (@hierarchyFlag = 2)
            BEGIN
              SELECT 'insert into ban_nad (OP,NADREJEN,VODJA) VALUES (''' +replace(ltrim(replace(a.Code, '0', ' ')), ' ', '0')+''',''' +replace(ltrim(replace(b.Code, '0', ' ')), ' ', '0')+''',''0'');'
              FROM [dbo].[vProfile] a, [dbo].[vProfile] b
              WHERE a.Code <> b.Code AND ISNULL(@profileName, 'A') = CONCAT(ISNULL(b.HibisProfileName, 'A'), '_STUDENT')  AND replace(ltrim(replace(a.Code, '0', ' ')), ' ', '0') = @Code
              UNION
                SELECT 'insert into ban_nad (OP,NADREJEN,VODJA) VALUES (''' +replace(ltrim(replace(dv.Code, '0', ' ')), ' ', '0')+''',null,''1'');'
              FROM [dbo].[vSB_IdM_Hibis_Profile] dv
              WHERE  replace(ltrim(replace(dv.Code, '0', ' ')), ' ', '0') = @Code
              UNION
              SELECT 'insert into ban_nad (OP,NADREJEN,VODJA) VALUES (''' +replace(ltrim(replace(b.OP, '0', ' ')), ' ', '0')+''',''' +replace(ltrim(replace(a.code, '0', ' ')), ' ', '0')+''',''0'');'
              FROM [dbo].[vProfile] a, [dbo].[Hierarchy_Ex] b
              WHERE ISNULL(@profileName, 'A') = ISNULL(b.PROFILENAME, 'B')  AND replace(ltrim(replace(a.Code, '0', ' ')), ' ', '0') = @Code
          END
    */
      FETCH NEXT FROM @db_cursor INTO @profileName
    END
    CLOSE @db_cursor;
    DEALLOCATE @db_cursor;


    this outputs:
    (2 rows affected)
    Profile 1
    Profile 2

    As your table definitions and data are not listed - you will have to test which part is not causing the multiple result to be generated (or it could be your calling application only saving the first dataset, not both)