Как оценивать условие в SQL Server?

У меня есть процедура, хранившаяся в SQL Server, у которой в свою очередь есть курсор и все в порядке.

Тема состоит в том, что я должен оценивать, если повторяются символы в поле Nombre базы данных. Я это делаю здесь:

select (len(Nombre) - DATALENGTH(replace(Nombre, 'a', ''))) / len('a')
from dbo.Usuariostest 
where Nombre = @USUARIOS

то, что он перемещает, и то, в чем я нуждаюсь, состоит в том, чтобы видеть, как я могу делать условие для того, чтобы, если у этого имени есть два равных символа, он изменил состояние другого поля типа bool в фальшивый.

Полное добавление то, что у меня есть

USE [mbctest]
GO
/****** Object:  StoredProcedure [dbo].[VERUSUARIOS]    Script Date: 28/12/2016 23:56:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[VERUSUARIOS]
    AS

    BEGIN TRY

    DECLARE @USUARIOS VARCHAR(50);
    DECLARE @var INT

    DECLARE  CURSORUSUARIOSS CURSOR 

    FOR SELECT USUARIO FROM DBO.USUARIOSTEST

    OPEN CURSORUSUARIOSS;

    FETCH CURSORUSUARIOSS INTO @USUARIOS

    WHILE (@@FETCH_STATUS=0)

    BEGIN

    SET @var = (select (len(Nombre) - DATALENGTH(replace(Nombre, 'a', ''))) / len('a')
    from dbo.Usuariostest where Nombre = @USUARIOS)


    UPDATE DBO.USUARIOSTEST SET HABILITADO=0 where @varn = 2


    FETCH NEXT FROM CURSORUSUARIOSS INTO @USUARIOS

    END

    CLOSE CURSORUSUARIOSS

    DEALLOCATE CURSORUSUARIOSS

    END TRY

BEGIN CATCH
       SELECT ERROR_NUMBER() AS ERRNUMBER
       , ERROR_SEVERITY() AS ERRSEVERITY
       , ERROR_STATE() AS ERRSTATE
       , ERROR_PROCEDURE() AS ERRPROCEDURE
       , ERROR_LINE() AS ERRLINE
       , ERROR_MESSAGE() AS ERRMESSAGE

END CATCH
2
задан 30.12.2016, 07:03
0 ответов

Если ты хочешь реализовать это необходимым способом с одним CURSOR ты можешь делать это следующей формой. Ты будешь нуждаться в поле Id, я использовал один, который называется UserId (этот будет необходим, чтобы реализовывать UPDATE позже). Изменения в твой procedure - следующие:

ALTER PROCEDURE [dbo].[VERUSUARIOS]
AS
BEGIN TRY
    DECLARE @USUARIOS VARCHAR(50);
    DECLARE @var INT
    DECLARE @UsuarioId INT
    DECLARE @i INT
    DECLARE @char CHAR

    SET @i = 0
    SET @char = ''

    DECLARE CURSORUSUARIOSS CURSOR LOCAL
    FOR
    ---
    SELECT UserId, Nombres
    FROM dbo.Usuariostest

    OPEN CURSORUSUARIOSS;
    FETCH CURSORUSUARIOSS INTO @UsuarioId, @USUARIOS
    WHILE (@@FETCH_STATUS = 0)
    BEGIN

        PRINT @USUARIOS
        PRINT LEN(@USUARIOS)

        BEGIN
            WHILE @i < LEN(@USUARIOS)
            BEGIN
                SELECT @i = @i + 1
                SET @char = SUBSTRING(@USUARIOS, @i, 1)

                UPDATE dbo.Usuariostest
                SET HABILITADO = 0
                WHERE UserId = @UsuarioId AND LEN(Nombres) - LEN(REPLACE(Nombres, @char, '')) > 1 --Esta línea hace la magia, si el caracter se encuenta más de una vez es cuando se cumple la condición
            END
        END
        SET @i = 0
        FETCH NEXT
        FROM CURSORUSUARIOSS
        INTO @UsuarioId, @USUARIOS

    END
    CLOSE CURSORUSUARIOSS
    DEALLOCATE CURSORUSUARIOSS
END TRY

BEGIN CATCH
    SELECT ERROR_NUMBER() AS ERRNUMBER
        ,ERROR_SEVERITY() AS ERRSEVERITY
        ,ERROR_STATE() AS ERRSTATE
        ,ERROR_PROCEDURE() AS ERRPROCEDURE
        ,ERROR_LINE() AS ERRLINE
        ,ERROR_MESSAGE() AS ERRMESSAGE
END CATCH

Заметь: Я привел в соответствие твой код в таблицу пользователей, которую я использую, если тебе удавалось иметь какую-то одинокую ошибку, приведи в соответствие имена полей и(или) подмостков.

UPDATE: Уходит один CURSOR что не был необходим

2
ответ дан 03.12.2019, 17:56