none
Alguem sabe como consigo resolver esse problema?? RRS feed

  • Pergunta

  • Estou fazendo uma migração de dados de um banco de origem para um de destino...

    Estou tentando utilizar esse codigo para inserir esses dados na tabela "AccessGroupEntries" 

    DECLARE @CardNo VARCHAR(16),
    @RawNumber NVARCHAR(100),
    @AccessLevel VARCHAR(3),
    @UserName VARCHAR(50),
    @UserId INT,
    @CompanyName VARCHAR(100),
    @Status BIT,
    @AccessGroupId INT


    DECLARE users_cusor CURSOR
    FOR
    SELECT [CardNo],
    [AccessLevel],
    [Name],
    [CardDB_09],
    [Status]
    Name FROM [VAULT].[dbo].[CardDB]

    SELECT [Id] FROM [unitydb].[dbo].[Users]

    OPEN users_cusor

    FETCH NEXT FROM users_cusor
    INTO @CardNo, @AccessLevel, @UserName, @CompanyName, @Status

    WHILE @@FETCH_STATUS = 0  
    BEGIN 

    SET @UserId = @@IDENTITY

    SET @RawNumber = LOWER(CONVERT(VARCHAR(8),CONVERT(VARBINARY(4), CAST(@CardNo AS BIGINT)),2))



    SET @AccessGroupId = (SELECT Id FROM AccessGroups WHERE Description = @AccessLevel)
    --SELECT @AccessGroupId
    --SET @UserId = (SELECT Id FROM Users WHERE Id = (SELECT UserId FROM Cards))
    --SELECT @UserId

    IF (@AccessGroupId IS NOT NULL)
    BEGIN
    INSERT INTO [dbo].[AccessGroupEntries]
       ([AccessGroupId]
       ,[EntityType]
       ,[EntityId])
    VALUES
       (@AccessGroupId,
       16,
       @UserId)
    END


    FETCH NEXT FROM users_cusor
    INTO  @CardNo, @AccessLevel, @UserName, @CompanyName, @Status

    END   
    CLOSE users_cusor;  
    DEALLOCATE users_cusor;

    esse codigo retorna esse erro: "Cannot insert the value NULL into column 'EntityId', table 'unitydb.dbo.AccessGroupEntries'; column does not allow nulls. INSERT fails."

    Dei um select nessas variaveis que uso que sao @AccessGroupId ...

    E somente retorna dados no @AccessGroupId e @UserId está como nulo dai o problema...

    Possui um codigo de um Set comentado que é uma das soluções que estou tentando para deixar de ser nulo o conteudo do @UserId e é onde preciso de uma luz...

    que quando rodo com aquele Set da o seguinte erro: "Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression."

    que aparentemente é pq esse tipo de query só pode retornar um valor e isso que não sei como concerta porque preciso de todos os Ids para usar aquela variavel...

    Espero que dê para compreender, desde já agradeço!!

    *OBS: CONSIDERE SOMENTE O @ACCESSGROUPID E @USERID AS OUTRAS VARIAVEIS É OUTRA PARTE DO CODIGO 


    • Editado brunights quarta-feira, 11 de maio de 2022 20:37
    quarta-feira, 11 de maio de 2022 20:35

Respostas

  • Brunights,

    Então, neste você tem que trocar o operador igual (=) pelo operador lógico condicional In:

    (SELECT Id FROM Users WHEREId In (SELECT UserId FROM Cards))
    Go


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta brunights quarta-feira, 18 de maio de 2022 13:13
    terça-feira, 17 de maio de 2022 22:46

Todas as Respostas

  • Boa noite, não seria mais fácil fazer um select dos dados e depois salvar como csv e então importar, ou fazer a aplicação fazer a sincronia e não o bando de dados, mas creio que seu problema esteja aqui :SET @AccessGroupId = (SELECT Id FROM AccessGroups WHERE Description = @AccessLevel) uma vez que esta produrando um int com uma string varchar (3)
    quinta-feira, 12 de maio de 2022 02:14
  • Não... ao contraio esse Set funciona perfeitamente, como comentei o o erro que aparece é no próximo Set que tentei que está comentado
    quinta-feira, 12 de maio de 2022 11:25
  • Brunights,

    Provavelmente esta subquery: (SELECT Id FROM Users WHERE Id = (SELECT UserId FROM Cards))

    Esta retornando mais de uma linha, recomendo que você coloque uma condição no Select que esta trazendo os dados da tabela Cards.

    Veja este exemplo:

    (SELECT Id FROM Users WHERE Id = (SELECT UserId FROM Cards
    Where Id = -- Informe aqui o ID -- para filtrar e trazer a linha deseja da tabela cards))
    Go


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sábado, 14 de maio de 2022 17:05
  • mas no caso eu preciso de todos os UserId que vai retornas da tabela de Cards e tendo esses ids eu vou comprarar com os ids de Users, se for igual ai eu vou usar o resultado nas demais coisas...
    segunda-feira, 16 de maio de 2022 19:35
  • Brunights,

    Então, neste você tem que trocar o operador igual (=) pelo operador lógico condicional In:

    (SELECT Id FROM Users WHEREId In (SELECT UserId FROM Cards))
    Go


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta brunights quarta-feira, 18 de maio de 2022 13:13
    terça-feira, 17 de maio de 2022 22:46