是什么允许SQL Server用对象名称交换传递给系统过程的字符串


13

是什么导致将对象名称传递给系统存储过程合法sp_helptext呢?

什么机制将对象名称转换为字符串?

例如

-- works
sp_helptext myproc
sp_helptext [myproc]
sp_helptext [dbo.myproc]
-- and behaves the same as a string
sp_helptext 'myproc'
sp_helptext 'dbo.myproc'

-- does not work
sp_helptext dbo.myproc -- Msg 102, Level 15, State 1, Line 1 incorrect syntax near '.'
-- an additional case that does not work.
sp_helptext [dbo].[myproc] -- Msg 102, Level 15, State 1, Line 1 incorrect syntax

似乎我不需要单引号有效的proc名称似乎很奇怪,除非它具有.分开的模式名称和过程名称。我正在寻找一种解释,说明如何将其自动从带引号的名称转换为要作为参数值传递的字符串文字。

我没有要解决的特定问题;我只是对那些没有记录的东西感到好奇。


评论中的贡献已移至此聊天室
保罗怀特9

Answers:


10

系统存储过程的第一个参数sp_helptext是:

[@objname= ] 'name'
是用户定义的模式范围对象的合格名称或非合格名称。仅当指定了合格对象时才需要引号。如果提供了包括数据库名称在内的标准名称,则该数据库名称必须是当前数据库的名称。该对象必须在当前数据库中。名称是nvarchar(776),没有默认值。

此外,定界标识符(数据库引擎)的文档指出:

在SQL Server中使用标识符作为参数
许多系统存储过程,函数和DBCC语句都将对象名称作为参数。其中一些参数接受多部分对象名称,而其他参数仅接受单部分名称。预期使用单部分名称还是多部分名称决定了SQL Server在内部如何解析和使用参数。

单部分参数名称
如果参数是单部分标识符,则可以通过以下方式指定名称:

  • 没有引号或定界符
  • 用单引号引起来
  • 用双引号引起来
  • 放在括号中

Multipart参数名称
Multipart名称是合格名称,包括数据库或架构名称以及对象名称。当将多部分名称用作参数时,SQL Server要求将组成多部分名称的完整字符串括在一组单引号中。


第一个参数sp_helptext接受单部分(非限定)和多部分(限定)对象名称。

如果T-SQL解析器将后面的项目解释sp_helptext单部分名称(根据上面的四个要点),则将生成的名称作为过程期望的(字符串类型)参数值进行传递。

当解析器将其视为多部分名称时,必须按规定将文本用单引号引起来。

多部分名称的关键特征是.分隔符(在任何定界符之外)。

问题中的这些示例已成功解释为单部分名称:

myproc-单部分(不带引号或定界符-项目符号#1)
[myproc]-单部分(括号内-项目4)
'myproc'-单部分(单引号-项目符号2)
'dbo.myproc'- 带有所需单引号的多部分
[dbo.myproc]-单部分(括号内-项目4)

问题的最后两个示例都被解析为多部分参数名称(由于使用了.分隔符)。它们产生错误是因为它们缺少必需的单引号引起来:

dbo.myproc-多部分,没有必需的单引号
[dbo]。[myproc]-多部分,没有必需的单引号

这个使用双引号的额外示例成功完成:

“ dbo.myproc”-单部分(双引号-项目符号#3)

请注意,它成功地(对于过程参数值)解释为有效的单部分名称,但是过程代码能够灵活地解释(使用PARSENAMEOBJECTID)接收到的(多部分)字符串。

最后,请注意,此处使用双引号并不取决于的设置QUOTED_IDENTIFIER

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.