EXEC y Set Quoted_Identifier

Tengo un procedimiento almacenado [A] que crea otro process almacenado [B]

[A] Nunca será ejecutado por usuarios finales y no tiene parameters u otros datos que no sean de confianza. En cambio, lo utilizo simplemente para automatizar la creación del complejo SP [B]. [A] Siempre tendrá el mismo resultado a less que se cambien las partes internas. Por lo tanto, considero que esto es seguro.

[B] requiere Quoted_Identifiers ON ya que usa xml.

Si copio y pego el SP generado, funciona bien, pero si dejo que [A] lo cree con EXEC, el SP falla al ejecutarse.

He intentado agregar SET QUOTED_IDENTIFIERS ON dentro de [B] pero no tiene ningún efecto notable.

El mismo problema también ocurre si uso sp_ExecuteSQL. También intenté configurarlo antes de llamar a [B], pero eso también parece no tener ningún efecto (pero ¿por qué lo haría en un context donde siempre estaba activado)?

Mi suposition es que EXEC y sp_ExecuteSQL siempre usan la configuration OFF y el command SET es procesado por el analizador en lugar del propio motor SQL. Entonces, ¿cómo puedo hacer que EXEC cree el process correctamente?

Necesita QUOTED_IDENTIFIER para estar ON donde se haya creado el procedimiento A almacenado. Nota:

Cuando se crea un procedimiento almacenado, las configuraciones SET QUOTED_IDENTIFIER y SET ANSI_NULLS se capturan y se usan para invocaciones posteriores de ese procedimiento almacenado.

Lo cual implica, implícitamente, que cualquier procedimiento almacenado que crea procedimientos almacenados transmitirá los ajustes que estaban vigentes durante su propia creación. P.ej:

 set quoted_identifier on go create procedure ABC as exec('create procedure DEF as') go set quoted_identifier off go exec ABC go select definition,uses_quoted_identifier from sys.sql_modules where object_id=OBJECT_ID('DEF') 

produce:

 definition uses_quoted_identifier -------------------------------------- ---------------------- create procedure DEF as 1 
Intereting Posts