创建/修改具有不同 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 @Definition
,MyCreatingProcedureThatHasQIOff
只是一个非常愚蠢的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 值的多个对象(在存储过程中)的主要内容,如果未能解决你的问题,请参考以下文章