创建/修改具有不同 QUOTED_IDENTIFIER 值的多个对象(在存储过程中)

Posted

技术标签:

【中文标题】创建/修改具有不同 QUOTED_IDENTIFIER 值的多个对象(在存储过程中)【英文标题】:Create/Amend multiple objects (within a sproc) with different QUOTED_IDENTIFIER values 【发布时间】:2021-08-30 13:08:46 【问题描述】:

作为开发辅助,我正在编写一个存储过程,该过程将数据库对象从一个数据库创建/修改到另一个数据库。 (sproc 采用 CSV 对象名称字符串,它使用 XML 将其拆分为单独的值,因此需要打开 QUOTED_IDENTIFIER 才能运行 sproc。)

但是,正在创建/修改的对象包括可以打开或关闭 QUOTED_IDENTIFIER 的存储过程。

根据very similar question 的答案(专门讨论创建单个 存储过程),如果您在另一个存储过程中创建/修改存储过程,它将始终 使用“父”存储过程中设置的QUOTED_IDENTIFIER 值。

有人知道在创建/修改多个存储过程时能够设置不同的QUOTED_IDENTIFIER 标志值的方法吗?

我在循环中尝试了非常简单的代码(如下所示),但正如上面的答案所暗示的,这对结果没有影响,并且创建/修改的存储过程始终将 QUOTED_IDENTIFIER 设置为 ON。 ..

IF @QUOTED = 1 -- from sys.sql_modules.uses_quoted_identifier
  SET QUOTED_IDENTIFIER ON
ELSE
  SET QUOTED_IDENTIFIER OFF

EXEC sp_executesql @DEFINITION -- from sys.sql_modules.definition

【问题讨论】:

我的想法是写另一个存储过程来为你做sp_executesql,这个QUOTED_IDENTIFIER明确设置为OFF,并在你需要的时候调用它。 感谢@Jeroen - 问题是我正在使用 XML 处理对象名称的 CSV,因此我需要将其设置为 ON。这也意味着需要更多时间来确定哪些存储过程是ON,哪些是OFF,以分配给适当的开发辅助存储过程。在“理想世界”中,我有一个单独的 dev-aid sproc,我将所有对象名称都扔到它上面,它可以应付(所以我不必!) @Jeroen - 当然,我可以拥有三个存储过程...主要的存储过程,然后根据是否需要调用两个辅助存储过程之一 @987654335 @ 或 OFF。我会回复你的 是的,我知道“主”存储过程需要它ON,但是您不必询问现在存储过程的设置是什么(上面的 @QUOTED)所以如果你可以,你可以做IF @QUOTED = 0 EXEC MyCreatingProcedureThatHasQIOff @DefinitionMyCreatingProcedureThatHasQIOff 只是一个非常愚蠢的EXEC 命令代理。 @Jeroen - 宾果游戏 - 就是这样......谢谢你让我走上这条路。如果你喜欢这个功劳,请写一个答案,否则我会自己写一个解释 3 个 sprocs 的创建(1 个主,2 个子) 【参考方案1】:

非常感谢@Jeroen 让我找到了解决方案,即创建另一个开发辅助存储过程,将QUOTED_IDENTIFIER 设置为OFF

在主要开发辅助存储过程的主循环中,它通过自身(如果需要ON)或通过辅助存储过程(如果需要OFF)执行定义。

这是我现在工作的非常简化的伪版本...

SET QUOTED_IDENTIFIER OFF
GO
CREATE PROCEDURE DEV_AID_SUB
  @DEFINITION NVARCHAR(MAX)
AS
  EXEC sp_executesql @DEFINITION

---

SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE DEV_AID
AS
BEGIN
  WHILE @LOOP = 1
    IF @QUOTED = 1
      EXEC sp_executesql @DEFINITION
    ELSE
      EXEC DEV_AID_SUB @DEFINITION
  END
END

【讨论】:

以上是关于创建/修改具有不同 QUOTED_IDENTIFIER 值的多个对象(在存储过程中)的主要内容,如果未能解决你的问题,请参考以下文章

Imagick - 创建两个不同级别的透明度

无法合并具有两个不同实体的模型

LINUX软硬链接小结

如何根据 targetTypes 修改旧的命名样式以具有不同的设置器?

java简单工厂模式

具有多个颜色行的悬停表[重复]