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