none
Actualizar tabla en servidor vinculado RRS feed

  • Pregunta

  • Hola a todos,

    hace 5 años que no programo nada y la práctica se oxida, pido disculpas de antemano por si pongo alguna burrada. Os cuento:

    Quiero hacer una actulización de datos en una tabla de un servidor vinculado, el caso es que esa tabla tiene datos como estos:
    Código / Talla / Color / Cantidad

    00164 /      /     / 0

    00164/ S /   / 0

    00164 / / AZU / 0

    00164 / S / AZU / 1

    00164 / M / AZU / 2

    00164 / L / AZU / 1

    En las tres últimas lineas figuran las cantidades de cada talla y color y en las dos primeras en lugar de 0 debería poner el total que corresponde (4 para la primera fila, 1 para la segunda y 4 para la tercera) ya que hay 4 unidades en total, 1 de la talla S y 4 de color azul.

    Bien para actualizar los datos me he creado un cursor tal que así:

    DECLARE CursorArticulo CURSOR FOR                    

            SELECT * FROM OPENQUERY(FACTUSOL, 'SELECT F_STC.ARTSTC,
                                                    Sum(F_STC.ACTSTC) AS Existencias
                                                FROM F_STC
                                                WHERE (((F_STC.CE1STC)<>"")
                                                    AND ((F_STC.CE2STC)<>""))
                                                GROUP BY F_STC.ARTSTC
                                                ORDER BY F_STC.ARTSTC;')

        
            OPEN CursorArticulo
            FETCH NEXT FROM CursorArticulo
            INTO @ArticuloCodigo,
                @CantidadDisponible
            
            WHILE @@FETCH_STATUS = 0
                BEGIN
                    SET @SQLConsulta = 'UPDATE OPENQUERY(FACTUSOL, ''SELECT ARTSTC, ACTSTC, DISSTC FROM F_STC WHERE ARTSTC = ''' + @ArticuloCodigo + ''' AND CE1STC = "" AND CE2STC = ""'')' + ' SET ACTSTC = ' + CAST(@CantidadDisponible AS nVarChar(10)) + ', DISTC = ' + CAST(@CantidadDisponible AS nVarChar(10))
                    PRINT @SQLConsulta
                    EXEC @SQLConsulta
                    FETCH NEXT FROM CursorArticulo
                    INTO @ArticuloCodigo,
                        @CantidadDisponible
                END
            CLOSE CursorArticulo
        DEALLOCATE CursorArticulo

    Y al ejecutarlo me da un error

    El nombre 'UPDATE OPENQUERY(FACTUSOL, 'SELECT ARTSTC, ACTSTC, DISSTC FROM F_STC WHERE ARTSTC = '00001' AND CE1STC = "" AND CE2STC = ""') SET ACTSTC = 0, DISTC = 0' no es un identificador válido.

    Estoy perdido, ¿alguien me ayuda a reencontrarme con la programación?

    Muchas gracias de antemano

    miércoles, 3 de febrero de 2021 23:09

Todas las respuestas

  • Hola Wuaala:

    Si observas la sentencia que muestras al final dice:

    WHERE ARTSTC = '00001' ...hasta aquí bien

    AND CE1STC='' ''... esto no parece correcto, puesto que están duplicados los apóstrofes.

    AND CE2STC = ''''' aquí también parecen duplicados los apóstrofes, ya que el último es el de cierre de la select.

    ojo que no se de donde has sacado la query (me supongo que del print), pero o la primera columna del where o la segunda y la tercera están diferentes, por tanto algo no encaja.

    jueves, 4 de febrero de 2021 6:18
  • Muchas gracias Javi por tu ayuda, se nota la oxidación, para no liarme he sustituido el apóstrofo por CHR(39) pero sigo igual, va a ser una chorrada, pero no la encuentro, tengo que ponerme en forma antes de jugar un partido

    DECLARE @SQLConsulta AS nVarChar(Max)

    SET @SQLConsulta = 'UPDATE OPENQUERY(FACTUSOL, ' + CHAR(39) + 'SELECT ARTSTC, ACTSTC, DISSTC FROM F_STC WHERE ARTSTC = ' + CHAR(39) + '00001' + CHAR(39) + ' AND CE1STC = ' + CHAR(39) + CHAR(39) + ' AND CE2STC = ' + CHAR(39) + CHAR(39) +') SET ACTSTC = 17, DISTC = 17'

    PRINT @SQLConsulta
    EXEC @SQLConsulta

    Respuesta del servidor:

    UPDATE OPENQUERY(FACTUSOL, 'SELECT ARTSTC, ACTSTC, DISSTC FROM F_STC WHERE ARTSTC = '00001' AND CE1STC = '' AND CE2STC = '') SET ACTSTC = 17, DISTC = 17
    Msg 203, Level 16, State 2, Line 7
    El nombre 'UPDATE OPENQUERY(FACTUSOL, 'SELECT ARTSTC, ACTSTC, DISSTC FROM F_STC WHERE ARTSTC = '00001' AND CE1STC = '' AND CE2STC = '') SET ACTSTC = 17, DISTC = 17' no es un identificador válido.

    jueves, 4 de febrero de 2021 12:01
  • Hola Wuaala:

    Hay cosas que no entiendo muy bien. Porque no empezar así:

    Porque ejecutas la query a través de un exec. Porque no lo haces directamente con update OpenQuery

    UPDATE OPENQUERY(FACTUSOL, 
    'SELECT ARTSTC, ACTSTC, DISSTC FROM F_STC WHERE ARTSTC = ''00001'' 
    AND CE1STC = '''' AND CE2STC = ''''')
    SET ACTSTC = 17, DISTC = 17;

    Entiendo que ActStc = 17, realmente habrá que sustituirlo por la variable del cursor, y lo mismo con DisTc

    Las comillas de ArtStc = un varchar o varchar2 por eso doblamos el apóstrofe.

    Las comillas de Ce1stc es lo mismo que igual a '' por eso doblamos los apóstrofes. Porque lo que buscas es que no tenga longitud esa columna para updatear el valor

    Las comillas de Ce2Stc es lo mismo que igual a ''. Por lo mismo que lo anterior.


    jueves, 4 de febrero de 2021 15:12
  • Muchas gracais Javi,

    poco a poco me voy engrasando, aunque mañana seguro que tendré otra duda chorra como esta.

    Muchas gracias.

    jueves, 4 de febrero de 2021 21:54