我有一个存储过程 [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正确创建proc呢?
最佳答案
你需要QUOTED_IDENTIFIER
在创建存储过程 A
的位置为 ON
。注意:
When a stored procedure is created, the SET QUOTED_IDENTIFIER and SET ANSI_NULLS settings are captured and used for subsequent invocations of that stored procedure.
这意味着任何创建存储过程的存储过程都将传递在其创建过程中生效的设置。例如:
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
关于sql - 执行并设置 Quoted_Identifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22324262/