sql - 执行并设置 Quoted_Identifier

标签 sql sql-server stored-procedures sp-executesql quoted-identifier

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

相关文章:

sqlzoo 跟踪加入练习

sql - SQL在表达式上以(使用`LIKE`)开始

sql - 分区 Athena 表中的子查询

SQL Server 按日期分组

sql - SQL Server 中的 MS Project 数据

mysql - 如何获取最后一个 select 语句的结果集?

mysql - 匹配的行和更改的行之间的差异

sql - 从 SQL Server 中的两个不同服务器选择数据

java - JPA 2.1 - @NamedStoredProcedureQuery - ParameterMode.IN - null 值给出错误

C# - 接受参数并返回值的 SQL 过程