SET QUOTED_IDENTIFIER Error en el trabajo y sp_MSForEachTable

Tengo este trabajo de servidor sql corriendo cada 3 segundos en el bucle infinito. El código pasa por todas las tablas en un determinado esquema, toma los valores e inserta en otra base de datos cada 3 segundos:

USE simulation_db

While 1 = 1
BEGIN
    EXEC sp_MSForEachTable 
        @precommand = 'use [simulation_db];',
        @command1 = 
        '
            if ((select top(1) sy from ? ORDER BY cap desc) = 1)
            BEGIN
                EXEC sp_change_table_sync ''?'', 0;
            END
        ',
        @command2 = 
        '
            DECLARE @var NVARCHAR(MAX) = (select top(1) vari from ? where sy = 0)
            if ((@var BETWEEN 226 AND 239) OR (@var BETWEEN 241 AND 252) OR (@var BETWEEN 256 AND 258))
            BEGIN
                insert into demo.? (
                    [cap] ,
                    [val] ,
                    [qual] ,
                    [we] ,
                    [fa] ,
                    [vari] ,
                    [fi] ,
                    [sy]
                ) select top(1)
                    GETDATE(),
                    val,
                    qual,
                    we,
                    fa,
                    vari,
                    fi,
                    1
                from ? where sy = 0
            END
        ',
        @command3=
        '
            DECLARE @var NVARCHAR(MAX) = (select top(1) vari from ? where sy = 0)
            if ((@var BETWEEN 226 AND 239) OR (@var BETWEEN 241 AND 252) OR (@var BETWEEN 256 AND 258))
            BEGIN
                update ? set sy = 1 from ? tb
                join (select top(1) * from ? where sy = 0) tp 
                    ON tb.cap = tp.cap AND tb.we = tp.we
                WHERE tb.cap= tp.cap AND tb.we = tp.we
            END
        ',
        @whereand = 
        '
            and upper(schema_name(schema_id)) = ''inbox''
        '
    WAITFOR DELAY '00:00:03.000';
END

En un entorno local, el código funciona bien, pero cuando se ejecuta en un servidor, genera el error SET QUOTED_IDENTIFIER. He intentado agregar el SET QUOTED_IDENTIFIER ON al comienzo del primer comando de la sp_MSForEachTable, pero todavía arroja el error, ¿alguien podría ayudarme?

EDIT:

He logrado resolver el problema añadiendo la propiedad SET justo antes de la inserción. Thx.

Pregunta hecha hace 3 años, 4 meses, 29 días - Por csscraftsman


3 Respuestas:

  • Quieres poner eso al comienzo de tu lote, es decir, antes de tu declaración de USE.

    Nota también, de Docs:

    El controlador SQL Server Native Client ODBC y SQL Server Native Client OLE DB Provider para SQL Server establecen automáticamente QUOTED_IDENTIFIER a ON al conectarse. Esto se puede configurar en fuentes de datos ODBC, en atributos de conexión ODBC o propiedades de conexión OLE DB. El valor predeterminado para SET QUOTED_IDENTIFIER es OFF para conexiones de aplicaciones DB-Library.

    Respondida el Dec 18, 2020 a las 00:49 - por codervoyager

    Votos positivos: 0 | Votos negativos: 0

  • ¡Me alegra saber que pudiste resolver el problema añadiendo la propiedad SET justo antes de la inserción! Esto es lo que se conoce como la configuración SET QUOTED_IDENTIFIER.

    Cuando SET QUOTED_IDENTIFIER está activado, las comillas dobles se utilizan para delimitar identificadores de objetos y las comillas simples delimitan literales de cadena. Esta configuración afecta cómo se interpretan los identificadores y las cláusulas WHERE en las consultas.

    Para futuras referencias, si necesitas activar SET QUOTED_IDENTIFIER dentro del código de SQL Server, puedes hacerlo utilizando la siguiente sintaxis:

    sql
    SET QUOTED_IDENTIFIER ON;
    

    Al activar SET QUOTED_IDENTIFIER dentro del código, puedes garantizar que se establezca correctamente antes de ejecutar las consultas que lo requieran.

    ¡Si tienes alguna otra pregunta o duda, estaré encantado de ayudarte!

    Respondida el Dec 19, 2020 a las 00:47 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Error SET QUOTED_IDENTIFIER

    Este error ocurre cuando se utiliza una instrucción SET QUOTED_IDENTIFIER en un entorno donde el modo de identificadores entre comillas no está habilitado. El modo de identificadores entre comillas controla si los identificadores (como nombres de tablas y columnas) deben estar entre comillas o no.

    Solución

    Para resolver este error, habilita el modo de identificadores entre comillas utilizando la instrucción SET QUOTED_IDENTIFIER ON:

    
    SET QUOTED_IDENTIFIER ON
    

    Esta instrucción debe colocarse antes de cualquier instrucción que utilice identificadores entre comillas. En tu caso, puedes agregarla al comienzo del primer comando de la sp_MSForEachTable:

    
    SET QUOTED_IDENTIFIER ON
    EXEC sp_MSForEachTable ...
    

    Ejemplo de código actualizado

    
    SET QUOTED_IDENTIFIER ON
    
    USE simulation_db
    
    While 1 = 1
    BEGIN
        EXEC sp_MSForEachTable 
            @precommand = 'use [simulation_db];',
            @command1 = 
            '
                if ((select top(1) sy from ? ORDER BY cap desc) = 1)
                BEGIN
                    EXEC sp_change_table_sync ''?'', 0;
                END
            ',
            @command2 = 
            '
                DECLARE @var NVARCHAR(MAX) = (select top(1) vari from ? where sy = 0)
                if ((@var BETWEEN 226 AND 239) OR (@var BETWEEN 241 AND 252) OR (@var BETWEEN 256 AND 258))
                BEGIN
                    insert into demo.? (
                        [cap] ,
                        [val] ,
                        [qual] ,
                        [we] ,
                        [fa] ,
                        [vari] ,
                        [fi] ,
                        [sy]
                    ) select top(1)
                        GETDATE(),
                        val,
                        qual,
                        we,
                        fa,
                        vari,
                        fi,
                        1
                    from ? where sy = 0
                END
            ',
            @command3=
            '
                DECLARE @var NVARCHAR(MAX) = (select top(1) vari from ? where sy = 0)
                if ((@var BETWEEN 226 AND 239) OR (@var BETWEEN 241 AND 252) OR (@var BETWEEN 256 AND 258))
                BEGIN
                    update ? set sy = 1 from ? tb
                    join (select top(1)  from ? where sy = 0) tp 
                        ON tb.cap = tp.cap AND tb.we = tp.we
                    WHERE tb.cap= tp.cap AND tb.we = tp.we
                END
            ',
            @whereand = 
            '
                and upper(schema_name(schema_id)) = ''inbox''
            '
        WAITFOR DELAY '00:00:03.000';
    END
    

    Nota:*

    Asegúrate de que no haya otras instrucciones SET QUOTED_IDENTIFIER en el script que puedan sobrescribir la configuración.

    Respondida el Dec 19, 2020 a las 00:54 - por Gemini

    Votos positivos: 0 | Votos negativos: 0