Create a cursor that update field type char value in Sql Server

jonathas moura 21 Reputation points
2020-08-25T00:51:44.173+00:00

Hello , i want create a cursor that update column of my table Schools with more than three levels of education are level A,
Schools with two levels of education are leveled with category B and other schools are leveled with category C.

I tried to do it in other ways but I stopped here:

BEGIN TRANSACTION
DECLARE @CODIGO_ESCOLA INT
DECLARE @DESCRICAO VARCHAR(50)
DECLARE @CODIGO_CIDADE INT
DECLARE @NIVEL CHAR(1)

DECLARE CURSOR_ATIVIDADE_INTEGRADORA CURSOR FOR
SELECT
CODIGO_ESCOLA,
DESCRICAO,
CODIGO_CIDADE,
NIVEL
FROM ESCOLA

OPEN CURSOR_ATIVIDADE_INTEGRADORA

FETCH NEXT FROM CURSOR_ATIVIDADE_INTEGRADORA INTO
@CODIGO_ESCOLA, @DESCRICAO, @CODIGO_CIDADE, @NIVEL
WHILE @@Fetch _STATUS = 0
BEGIN
DECLARE CURSOR_COD_ESCOLA_ENSINO CURSOR FOR
SELECT ENV.CODIGO_NIVEL_ENSINO
FROM ESCOLA_NIVELENSINO ENV
INNER JOIN ESCOLA E
ON ENV.CODIGO_ESCOLA = E.CODIGO_ESCOLA
OPEN CURSOR_COD_ESCOLA_ENSINO

IF @CODIGO_NIVEL_ENSINO < 3
UPDATE ESCOLA
SET NIVEL = @NIVEL
WHERE CODIGO_NIVEL_ENSINO = @CODIGO_NIVEL_ENSINO
ELSE
IF @CODIGO_NIVEL_ENSINO >= 3 AND @CODIGO_NIVEL_ENSINO <=4
UPDATE ESCOLA
SET NIVEL = @NIVEL
WHERE CODIGO_NIVEL_ENSINO = @CODIGO_NIVEL_ENSINO
ELSE
UPDATE ESCOLA
SET NIVEL = @nivel
WHERE CODIGO_NIVEL_ENSINO = @CODIGO_NIVEL_ENSINO
FETCH NEXT FROM CURSOR_EXERCICIO_GRUPO INTO
@CODIGO, @nome , @VALOR, @ESTOQUE

END
CLOSE CURSOR_ATIVIDADE_INTEGRADORA
DEALLOCATE CURSOR_ATIVIDADE_INTEGRADORA

SELECT * FROM ESCOLA
ROLLBACK

My tables in database there are:

CREATE TABLE ESCOLA
(
CODIGO_ESCOLA BIGINT NOT NULL,
DESCRICAO VARCHAR(50),
CODIGO_CIDADE BIGINT,
CONSTRAINT PK_CODIGO_ESCOLA PRIMARY KEY(CODIGO_ESCOLA),
CONSTRAINT FK_CIDADE FOREIGN KEY(CODIGO_CIDADE) REFERENCES CIDADE(CODIGO_CIDADE)
)

CREATE TABLE ESCOLA_NIVELENSINO
(
CODIGO_ESCOLA BIGINT,
CODIGO_NIVEL_ENSINO BIGINT,
CONSTRAINT PK_CODESCOLA_CODNVENSINO PRIMARY KEY(CODIGO_ESCOLA, CODIGO_NIVEL_ENSINO),
CONSTRAINT FK_CODIGO_ESCOLA FOREIGN KEY(CODIGO_ESCOLA) REFERENCES ESCOLA(CODIGO_ESCOLA),
CONSTRAINT FK_CODIGO_NIVEL_ENSINO FOREIGN KEY(CODIGO_NIVEL_ENSINO) REFERENCES NIVEL_ENSINO(CODIGO_NIVEL_ENSINO)
)

CREATE TABLE NIVEL_ENSINO
(
CODIGO_NIVEL_ENSINO BIGINT NOT NULL,
DESCRICAO VARCHAR(50),
CONSTRAINT PK_NIVEL_ENSINO PRIMARY KEY(CODIGO_NIVEL_ENSINO)
)

The inserts values:

INSERT INTO NIVEL_ENSINO VALUES
(1,'Ensino fundamental'),
(2,'Ensino Médio'),
(3,'Ensino Técnico'),
(4,'Ensino Superior')

INSERT INTO ESCOLA VALUES
(1, 'ufrj ', 1),
(2, 'ufrgs ', 4),
(3, 'USP ', 3),
(4, 'Escolinha do Professor Raimundo', 10),
(5, 'Escola do Rock', 7)

INSERT INTO ESCOLA_NIVELENSINO VALUES
(1, 3),
(1, 4),
(2, 3),
(2, 4),
(3, 3),
(4, 1),
(4, 2),
(4, 3),
(5, 1),
(5, 2)

Developer technologies | Transact-SQL
SQL Server | Other
0 comments No comments
{count} votes

Accepted answer
  1. Guoxiong 8,206 Reputation points
    2020-08-25T17:54:24.64+00:00
    ;WITH CTE_NIVEL_ENSINO_CONTAGEM_DE_ESCOLA AS (
        SELECT CODIGO_ESCOLA, COUNT(CODIGO_NIVEL_ENSINO) AS NIVEL_ENSINO_CONTAGEM_DE_ESCOLA
        FROM ESCOLA_NIVELENSINO
        GROUP BY CODIGO_ESCOLA
    )
    
    UPDATE e
    SET e.Level = CASE WHEN c.NIVEL_ENSINO_CONTAGEM_DE_ESCOLA >= 3 THEN 'A' WHEN c.NIVEL_ENSINO_CONTAGEM_DE_ESCOLA = 2 THEN 'B' ELSE 'C' END
    FROM ESCOLA AS e
    INNER JOIN CTE_NIVEL_ENSINO_CONTAGEM_DE_ESCOLA AS c 
    ON e.CODIGO_ESCOLA = c.CODIGO_ESCOLA;
    
    SELECT * FROM ESCOLA;
    
    0 comments No comments

1 additional answer

Sort by: Most helpful
  1. MelissaMa-MSFT 24,221 Reputation points
    2020-08-25T02:14:26.01+00:00

    Hi @jonathas moura ,

    What is your expected output?

    Per my understanding, it is not neccessary to use cursor to update the field.

    Please refer below query and modify it accordingly.

    DROP TABLE IF EXISTS #TABLE   
      
    ;WITH CTE AS (  
    select CODIGO_ESCOLA, ROW_NUMBER() OVER (PARTITION BY CODIGO_ESCOLA ORDER BY CODIGO_ESCOLA DESC) AS RN from ESCOLA_NIVELENSINO)  
      
    SELECT CODIGO_ESCOLA, MAX(RN) RN   
    INTO #TABLE  
    FROM CTE GROUP BY CODIGO_ESCOLA  
      
    UPDATE A   
    SET NIVEL=CASE WHEN B.RN>=3 THEN 'A' WHEN B.RN=2 THEN 'B' ELSE 'C' END  
    FROM ESCOLA A  
    INNER JOIN #TABLE B ON A.CODIGO_ESCOLA=B.CODIGO_ESCOLA  
      
    select * from ESCOLA  
    

    19966-1.png

    If the response is helpful, please click "Accept Answer" and upvote it.

    Best regards
    Melissa


Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.