Principales respuestas
Configuración incorrecta de QUOTED_IDENTIFIER

Pregunta
-
Buenas tardes, ante todo muchas gracias a las personas que me ayudaron en este foro a entender SQL, recurro a ustedes una vez mas para poder dar con el error que les voy a detallar,
Resulta que tengo un Stored en mi instancia de SQL que reindexa las tablas de cada DB, cree una una base llamada datos pero al correr el stored me da error:
Server: Msg 1934, Level 16, State 1, Line 48
DBCC failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'.Aclaro que está en una instancia Sql 2000.
Les comparto el codigo para que me digan que es lo incorrecto, ya que puse QUOTED_IDENTIFIER en ON y OFF pero sigue indicando el mismo error.
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET QUOTED_IDENTIFIER OFF
SET NUMERIC_ROUNDABORT OFF
SET NOCOUNT OFF
SET NOEXEC OFF
SET CURSOR_CLOSE_ON_COMMIT OFF
SET IMPLICIT_TRANSACTIONS OFF
--create table msdb..tmp_us (fecha datetime, execution nvarchar(100),resultado nvarchar(500))
DECLARE @TableName varchar(255)
DECLARE @TableSchema varchar(255)
DECLARE @DBName varchar(255)
DECLARE @IxTabla varchar(255)
IF OBJECT_ID('msdb..TempIX') IS NOT NULL
Drop table msdb..TempIX
DECLARE DBCursor CURSOR FOR
select name from master..sysdatabases where name like 'datos' order by name
OPEN DBCursor
FETCH NEXT FROM DBCursor INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
exec ('SELECT table_name, table_schema into msdb..TempIX FROM ' + @DBName + '.information_schema.tables
WHERE table_type = ''base table'' order by table_name')
DECLARE TableCursor CURSOR FOR
select table_name, table_schema from msdb..TempIX
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName, @TableSchema
WHILE @@FETCH_STATUS = 0
BEGIN
set @IxTabla = '[' + @DBName + '].[' + @TableSchema + '].[' + @TableName + ']'
print @IxTabla
-- insert into msdb..tmp_us values(getdate(), @IxTabla, null)
DBCC DBREINDEX(@IxTabla,' ',90)
FETCH NEXT FROM TableCursor INTO @TableName, @TableSchema
END
CLOSE TableCursor
DEALLOCATE TableCursor
DBCC SHRINKDATABASE(@DBName, 1)
Drop table msdb..TempIX
FETCH NEXT FROM DBCursor INTO @DBName
END
CLOSE DBCursor
DEALLOCATE DBCursor
GOmuchas gracias!
- Editado Robert Córdoba lunes, 24 de febrero de 2020 0:43
Respuestas
-
Hola Rober Córdoba:
Al menos el error ha cambiado, por tanto algo se ha realizado.
Lo primero es analizar para que sirven cada uno de los set que tienes en el script, porque a lo mejor no te sirven para nada.
Especifica el comportamiento conforme a ISO de los operadores de comparación Es igual a (=) y No es igual a (<>) cuando se usan con valores NULL en SQL Server 2019 (15.x).
Por tanto en este caso, no parece aplicar.
Controla el modo en que la columna almacena valores más cortos que el tamaño definido y el modo en que almacena valores con espacios en blanco finales en datos de tipo char, varchar, binaryy varbinary .
Esta opción solo afecta a la definición de nuevas columnas.Por tanto en este caso, no parece aplicar.
Especifica el comportamiento estándar de ISO para diversas condiciones de error.
Si es ON y aparecen valores NULL en funciones de agregado, como SUM, AVG, MAX, MIN, STDEV, STDEVP, VAR, VARP o COUNT, se genera un mensaje de advertencia. Si es OFF, no se genera ninguna advertencia.Si es ON, los errores de división por cero y desbordamiento aritmético hacen que la instrucción se revierta y que se genere un mensaje de error. Si es OFF, los errores de división por cero y de desbordamiento aritmético hacen que se devuelvan valores NULL.
Por tanto en este caso, no parece aplicar.
Termina una consulta cuando se produce un error de desbordamiento o división por cero durante su ejecución.
Por tanto en este caso, no parece aplicar.
Determina si los resultados de la concatenación se tratan como valores NULL o como valores de cadena vacía.
Por tanto en este caso, no parece aplicar.
Hace que SQL Server siga las reglas de ISO en cuanto a comillas delimitadoras de identificadores y cadenas literales se refiere. Los identificadores delimitados con comillas dobles pueden ser palabras clave reservadas de Transact-SQL o pueden contener caracteres normalmente no admitidos por las reglas sintácticas para identificadores de Transact-SQL.
Este si puede ser de aplicación, ya que es quien nos ha colocado en este hilo.
.....
Prueba el script.
SET QUOTED_IDENTIFIER ON DECLARE @TableName varchar(255) DECLARE @TableSchema varchar(255) DECLARE @DBName varchar(255) DECLARE @IxTabla varchar(255) IF OBJECT_ID('msdb..TempIX') IS NOT NULL Drop table msdb..TempIX DECLARE DBCursor CURSOR FOR select '['+name+']' from master..sysdatabases where name like 'datos' order by name -- ENTIENDO QUE ESTE WHERE LO APLICASTE SOLO PARA PROBAR. OPEN DBCursor FETCH NEXT FROM DBCursor INTO @DBName WHILE @@FETCH_STATUS = 0 BEGIN exec ('SELECT table_name, table_schema into msdb..TempIX FROM ' + @DBName + '.information_schema.tables WHERE table_type = ''base table'' order by table_name') DECLARE TableCursor CURSOR FOR select table_name, table_schema from msdb..TempIX OPEN TableCursor FETCH NEXT FROM TableCursor INTO @TableName, @TableSchema WHILE @@FETCH_STATUS = 0 BEGIN set @IxTabla = @DBName + '.[' + @TableSchema + '].[' + @TableName + ']' print @IxTabla -- insert into msdb..tmp_us values(getdate(), @IxTabla, null) /* Linea comentada -- DBCC DBREINDEX(@IxTabla,' ',90) Linea comentada */ FETCH NEXT FROM TableCursor INTO @TableName, @TableSchema END CLOSE TableCursor DEALLOCATE TableCursor /* Linea comentada -- DBCC SHRINKDATABASE(@DBName, 1) Linea comentada */ Drop table msdb..TempIX FETCH NEXT FROM DBCursor INTO @DBName END CLOSE DBCursor DEALLOCATE DBCursor GO
- Propuesto como respuesta Diana AcuñaModerator martes, 25 de febrero de 2020 17:15
- Marcado como respuesta Robert Córdoba martes, 25 de febrero de 2020 19:02
Todas las respuestas
-
Hola Robert Córdoba:
Prueba a realizar este cambio en tú script.
SET ANSI_NULLS ON SET ANSI_PADDING ON SET ANSI_WARNINGS ON SET ARITHABORT ON SET CONCAT_NULL_YIELDS_NULL ON SET QUOTED_IDENTIFIER ON SET NUMERIC_ROUNDABORT OFF SET NOCOUNT OFF SET NOEXEC OFF SET CURSOR_CLOSE_ON_COMMIT OFF SET IMPLICIT_TRANSACTIONS OFF --create table msdb..tmp_us (fecha datetime, execution nvarchar(100),resultado nvarchar(500)) DECLARE @TableName varchar(255) DECLARE @TableSchema varchar(255) DECLARE @DBName varchar(255) DECLARE @IxTabla varchar(255) IF OBJECT_ID('msdb..TempIX') IS NOT NULL Drop table msdb..TempIX DECLARE DBCursor CURSOR FOR select '['+name+']' from master..sysdatabases where name like 'datos' order by name -- ENTIENDO QUE ESTE WHERE LO APLICASTE SOLO PARA PROBAR. OPEN DBCursor FETCH NEXT FROM DBCursor INTO @DBName WHILE @@FETCH_STATUS = 0 BEGIN exec ('SELECT table_name, table_schema into msdb..TempIX FROM ' + @DBName + '.information_schema.tables WHERE table_type = ''base table'' order by table_name') DECLARE TableCursor CURSOR FOR select table_name, table_schema from msdb..TempIX OPEN TableCursor FETCH NEXT FROM TableCursor INTO @TableName, @TableSchema WHILE @@FETCH_STATUS = 0 BEGIN set @IxTabla = @DBName + '.[' + @TableSchema + '].[' + @TableName + ']' print @IxTabla -- insert into msdb..tmp_us values(getdate(), @IxTabla, null)
/* Linea comentada -- DBCC DBREINDEX(@IxTabla,' ',90) Linea comentada */
FETCH NEXT FROM TableCursor INTO @TableName, @TableSchema END CLOSE TableCursor DEALLOCATE TableCursor
/* Linea comentada -- DBCC SHRINKDATABASE(@DBName, 1) Linea comentada */
Drop table msdb..TempIX FETCH NEXT FROM DBCursor INTO @DBName END CLOSE DBCursor DEALLOCATE DBCursor GO
Te he puesto las acciones del shrink y del reindex entre comilladas, pero el resultado del print, tiene que ser que la/s base/s te salgan también entre corchetes.
[datos].[dbo].[tabla1]
[datos].[dbo].[tabla2]
Si no te retorna error, elimina las lineas donde existe el comentario /* Linea Comentada y Linea Comentada */
Espero te ayude, ya que a mi Sql Server 2000 se me queda muy antiguo, pero las bases de datos al no estar entre identificadores, podían devolverte un error.
- Propuesto como respuesta Diana AcuñaModerator martes, 25 de febrero de 2020 17:14
-
Hola Javier, Muchas gracias por la pronta respuesta, te comento que si ejecuto desde el analyzer esta Ok, pero cuando lo ejecuto desde el stored me da el error: Server: Msg 1934, Level 16, State 1, Procedure ReIndexAllDB_datos, Line 52
DBCC failed because the following SET options have incorrect settings: 'ANSI_NULLS.'.Pues no entiendo donde puede estar el error ya que hasta el print esta Ok
-
Hola Rober Córdoba:
Al menos el error ha cambiado, por tanto algo se ha realizado.
Lo primero es analizar para que sirven cada uno de los set que tienes en el script, porque a lo mejor no te sirven para nada.
Especifica el comportamiento conforme a ISO de los operadores de comparación Es igual a (=) y No es igual a (<>) cuando se usan con valores NULL en SQL Server 2019 (15.x).
Por tanto en este caso, no parece aplicar.
Controla el modo en que la columna almacena valores más cortos que el tamaño definido y el modo en que almacena valores con espacios en blanco finales en datos de tipo char, varchar, binaryy varbinary .
Esta opción solo afecta a la definición de nuevas columnas.Por tanto en este caso, no parece aplicar.
Especifica el comportamiento estándar de ISO para diversas condiciones de error.
Si es ON y aparecen valores NULL en funciones de agregado, como SUM, AVG, MAX, MIN, STDEV, STDEVP, VAR, VARP o COUNT, se genera un mensaje de advertencia. Si es OFF, no se genera ninguna advertencia.Si es ON, los errores de división por cero y desbordamiento aritmético hacen que la instrucción se revierta y que se genere un mensaje de error. Si es OFF, los errores de división por cero y de desbordamiento aritmético hacen que se devuelvan valores NULL.
Por tanto en este caso, no parece aplicar.
Termina una consulta cuando se produce un error de desbordamiento o división por cero durante su ejecución.
Por tanto en este caso, no parece aplicar.
Determina si los resultados de la concatenación se tratan como valores NULL o como valores de cadena vacía.
Por tanto en este caso, no parece aplicar.
Hace que SQL Server siga las reglas de ISO en cuanto a comillas delimitadoras de identificadores y cadenas literales se refiere. Los identificadores delimitados con comillas dobles pueden ser palabras clave reservadas de Transact-SQL o pueden contener caracteres normalmente no admitidos por las reglas sintácticas para identificadores de Transact-SQL.
Este si puede ser de aplicación, ya que es quien nos ha colocado en este hilo.
.....
Prueba el script.
SET QUOTED_IDENTIFIER ON DECLARE @TableName varchar(255) DECLARE @TableSchema varchar(255) DECLARE @DBName varchar(255) DECLARE @IxTabla varchar(255) IF OBJECT_ID('msdb..TempIX') IS NOT NULL Drop table msdb..TempIX DECLARE DBCursor CURSOR FOR select '['+name+']' from master..sysdatabases where name like 'datos' order by name -- ENTIENDO QUE ESTE WHERE LO APLICASTE SOLO PARA PROBAR. OPEN DBCursor FETCH NEXT FROM DBCursor INTO @DBName WHILE @@FETCH_STATUS = 0 BEGIN exec ('SELECT table_name, table_schema into msdb..TempIX FROM ' + @DBName + '.information_schema.tables WHERE table_type = ''base table'' order by table_name') DECLARE TableCursor CURSOR FOR select table_name, table_schema from msdb..TempIX OPEN TableCursor FETCH NEXT FROM TableCursor INTO @TableName, @TableSchema WHILE @@FETCH_STATUS = 0 BEGIN set @IxTabla = @DBName + '.[' + @TableSchema + '].[' + @TableName + ']' print @IxTabla -- insert into msdb..tmp_us values(getdate(), @IxTabla, null) /* Linea comentada -- DBCC DBREINDEX(@IxTabla,' ',90) Linea comentada */ FETCH NEXT FROM TableCursor INTO @TableName, @TableSchema END CLOSE TableCursor DEALLOCATE TableCursor /* Linea comentada -- DBCC SHRINKDATABASE(@DBName, 1) Linea comentada */ Drop table msdb..TempIX FETCH NEXT FROM DBCursor INTO @DBName END CLOSE DBCursor DEALLOCATE DBCursor GO
- Propuesto como respuesta Diana AcuñaModerator martes, 25 de febrero de 2020 17:15
- Marcado como respuesta Robert Córdoba martes, 25 de febrero de 2020 19:02