当前位置: 首页 > 面试题库 >

EXEC和设置Quoted_Identifier

劳英华
2023-03-14
问题内容

我有一个存储过程[A],它创建了另一个存储过程[B]

[A]永远不会由最终用户运行,并且没有参数或其他不受信任的数据。取而代之的是,它仅由我用来自动执行复杂SP
[B]的创建。[A]除非内部结构发生更改,否则总会有相同的结果。因此,我认为这是安全的。

[B]由于使用xml,因此要求Quoted_Identifiers处于启用状态。

如果我复制并粘贴生成的SP,它可以正常工作,但是如果我让[A]用EXEC创建它,则SP在运行时会失败。

我试过SET QUOTED_IDENTIFIERS ON在[B]内添加,但效果不明显。

如果我使用sp_ExecuteSQL,也曾在调用[B]之前尝试将其设置为on,但也会出现同样的问题,但这似乎也没有效果(但是为什么在始终处于on状态的上下文中会如此)

我的猜测是EXEC和sp_ExecuteSQL始终使用设置OFF,而SET命令则由解析器而不是SQL引擎本身处理。那么如何使EXEC正确创建proc?


问题答案:

您需要QUOTED_IDENTIFIERON其中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


 类似资料:
  • #include <unistd.h> int main(void) { execl("/bin/ls", "ls", NULL); return 0; } 技巧 使用gdb调试程序时,可以用“catch exec”命令为exec系列系统调用设置catchpoint,以上面程序为例: (gdb) catch exec Catchpoint 1 (exec) (gdb) r St

  • 问题内容: 我想通过运行程序时设置环境变量。这可能吗? 我试图这样设置: 但是结果消息说FOO不存在。 问题答案: 您必须传递一个包含键 env 的选项对象,该键 env 的值本身就是键值对的对象。

  • outputs/exec 插件的运用也非常简单,如下所示,将 logstash 切割成的内容作为参数传递给命令。这样,在每个事件到达该插件的时候,都会触发这个命令的执行。 output { exec { command => "sendsms.pl "%{message}" -t %{user}" } } 需要注意的是。这种方式是每次都重新开始执行一次命令并退出。本

  • 问题内容: 我刚刚开始自学Python,此脚本需要一些帮助: 我想得到它。 问题答案: 你快到了。您正在尝试修改全局变量,因此必须添加以下语句: 如果运行以下版本,则会看到您的版本中发生了什么: 输出: 运行它的方法,最终尝试在中修改函数的局部变量,这基本上是未定义的行为。请参阅文档中的警告: 注意: 默认 本地语言的 行为如以下功能所述:不应尝试对默认 本地 字典进行修改。如果需要在函数返回后查

  • 问题内容: 我必须编写一个可以运行管道的外壳。例如“” 这样的命令。我已成功解析了用户给出的命令,如下所示: “ ls” = firstcmd “ -l” = frsarg “ wc” = scmd “ -l” = secarg 现在,我必须使用两个fork,因为命令分别是两个和一个管道。我为执行命令编写的代码块如下: 因此,当我运行外壳程序并输入命令(例如)时,执行程序的结果不会显示,但外壳程序

  • 问题内容: 我正在尝试设置一个环境变量,然后将其读回以验证它是否确实被设置。 我有以下内容: 但是,它看起来总是空的,这意味着它可能设置不正确。 我的exec命令正确吗?javadocs声明它可以将字符串参数作为命令。 有任何想法吗? 问题答案: 这行不通。当您开始一个新过程时,该过程将收到环境 的副本 。然后,它对环境变量所做的任何更改都将在该副本中进行,并且在任何时候都不会对调用方可见。 您实