我有一个存储过程[a]创建另一个存储过程[B]
[A]将永远不会由最终用户运行,并且没有参数或其他不可信的数据。相反,我只是用它来自动创建复杂的SP [B]。[A]将总是有相同的结果,除非它的内部改变。因此,我认为这是安全的。
[B]要求Quoted_Identifiers为ON,因为它使用xml。
如果我复制并粘贴生成的SP,它可以正常工作,但如果我让[A]用EXEC创建它,那么SP在运行时失败。
我试过在[B]里面添加SET QUOTED_IDENTIFIERS ON
,但是没有明显的效果。
如果我使用sp_ExecuteSQL,同样的问题也会发生我也试过在调用[B]之前设置它,但这似乎也没有效果(但为什么它会在它总是打开的上下文中)
我的猜测是EXEC和sp_ExecuteSQL总是使用OFF设置,并且SET命令由解析器而不是SQL引擎本身处理。那么我怎样才能使EXEC正确地创建进程呢?
您需要QUOTED_IDENTIFIER
为ON
,其中创建了存储过程A
。注意:
创建存储过程时,将捕获SET QUOTED_IDENTIFIER和SET ANSI_NULLS设置,并将其用于对该存储过程的后续调用。
,这意味着任何创建存储过程的存储过程都将传递在其自己创建时生效的设置。例如:
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')
生产:
definition uses_quoted_identifier
-------------------------------------- ----------------------
create procedure DEF as 1