执行并设置 Quoted_Identifier

Posted

技术标签:

【中文标题】执行并设置 Quoted_Identifier【英文标题】:EXEC and Set Quoted_Identifier 【发布时间】:2014-04-14 23:29:04 【问题描述】:

我有一个存储过程 [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 呢?

【问题讨论】:

【参考方案1】:

您需要将 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

【讨论】:

嗯,我以为我试过了,但也许我把设置放错了地方。我再试一次。 (由于字符串中的字符串,实际上需要为 [A] 关闭它,但不是必需的) @Damien - 我很抱歉跳到这个线程上,但我有一个very similar question,但涉及从单个存储过程中创建/修改多个存储过程(具有不同的QUOTED_IDENTIFIER 值)。如果您能看一下,我将不胜感激……尽管我认为从上面我已经知道答案了

以上是关于执行并设置 Quoted_Identifier的主要内容,如果未能解决你的问题,请参考以下文章

可访问性可可 api 执行用户操作单击按钮并在文本字段上设置值

Pycharm中如何设置Python的执行环境

Pycharm中如何设置Python的执行环境

如何在服务器上设置 git 存储库,并允许多个用户执行 git pull,而不是由一个用户拥有?

TestNG 批量执行脚本Runner.xml - 并可以设置多线程并发跑脚本,提高跑脚本效率

Mysql查询动态行转动态列,并使用mybatis执行导出