none
Configuración incorrecta de QUOTED_IDENTIFIER RRS feed

  • 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
    GO

    muchas gracias!


    domingo, 23 de febrero de 2020 22:54

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.

    SET ANSI_NULLS

    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.

    SET ANSI PADDING

    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.

    SET ANSI WARNINGS

    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.

    SET ARITHABORT

    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.

    SET CONCAT_NULL_YIELDS_NULL

    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.

    SET QUOTED_IDENTIFIER

    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 
    martes, 25 de febrero de 2020 7:36

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.

    lunes, 24 de febrero de 2020 5:39
  • 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

    lunes, 24 de febrero de 2020 17:14
  • 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.

    SET ANSI_NULLS

    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.

    SET ANSI PADDING

    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.

    SET ANSI WARNINGS

    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.

    SET ARITHABORT

    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.

    SET CONCAT_NULL_YIELDS_NULL

    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.

    SET QUOTED_IDENTIFIER

    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 
    martes, 25 de febrero de 2020 7:36