Joh*_* N. 7 sql-server functions string-manipulation
在问题MS-SQL 上是否有任何(隐藏的)内置函数来取消引用对象名称?作者正在寻求有关是否存在“取消引用”引用字符串的内部函数的建议。作者McNets已经注意到,一些内部函数可以处理引用(例如[MyTable])和未引用(例如)MyTable传递的参数值(例如OBJECT_ID())。
在David Browne - Microsoft给出的答案 ( 1 ) 中,引述如下:
... QUOTENAME 的反面是 PARSENAME,它具有导航多部分名称的附加功能。
我不同意这部分答案的以下评论:
我不同意,你可以修改传递给一个参数
PARSENAME()来显示多部分的部分标识是它的SERVER,DATABASE,SCHEMA或OBJECT部分。但恕我直言,PARSENAME与此相反的说法QUOTENAME有点牵强。
我现在的问题是:
函数PARSENAME()是相反的QUOTENAME()吗?
......你可以找到一个字符串,
x这parsename(quotename(x),1)会比不同x?如果不是,则属于“反函数”的定义;) ...
...我创建了一个简单的语句来查看这些函数返回的不同值。代码如下:
DECLARE
-- Text that I will be converting using QUOTENAME()
@Text2Quote_1 AS NVARCHAR(20),
@Text2Quote_2 AS NVARCHAR(20),
@Text2Quote_3 AS NVARCHAR(20),
@Text2Quote_4 AS NVARCHAR(20),
-- The characters used for "quotation"
@QuoteChar_1 AS NCHAR(1),
@QuoteChar_2 AS NCHAR(1),
@QuoteChar_3 AS NCHAR(1),
-- The Parsing option as defined in the original MS documnenation for PARSSENAME()
@ParseParam AS INT
SET @Text2Quote_1 = N'Test'
SET @Text2Quote_2 = N'[Test]'
SET @Text2Quote_3 = N'Test.dbo.test'
SET @Text2Quote_4 = N'[Test].[dbo].[test]'
SET @QuoteChar_1 = ''''
SET @QuoteChar_2 = '['
SET @QuoteChar_3 = '"'
SET @ParseParam = 1 -- Parsing level : Object name
-- checking the results for ' single quotes
SELECT @Text2Quote_1 AS OriginalText_1,
@Text2Quote_2 AS OriginalText_2,
@Text2Quote_3 AS OriginalText_3,
@Text2Quote_4 AS OriginalText_4
SELECT QUOTENAME(@Text2Quote_1,@QuoteChar_1) AS QuotedText_1,
QUOTENAME(@Text2Quote_2,@QuoteChar_1) AS QuotedText_2,
QUOTENAME(@Text2Quote_3,@QuoteChar_1) AS QuotedText_3,
QUOTENAME(@Text2Quote_4,@QuoteChar_1) AS QuotedText_4
select PARSENAME(QUOTENAME(@Text2Quote_1,@QuoteChar_1),@ParseParam) AS Parsed_QuotedText_1,
PARSENAME(QUOTENAME(@Text2Quote_2,@QuoteChar_1),@ParseParam) AS Parsed_QuotedText_2,
PARSENAME(QUOTENAME(@Text2Quote_3,@QuoteChar_1),@ParseParam) AS Parsed_QuotedText_3,
PARSENAME(QUOTENAME(@Text2Quote_4,@QuoteChar_1),@ParseParam) AS Parsed_QuotedText_4
Run Code Online (Sandbox Code Playgroud)
基本上,我设置一个字符串值,输出该值,QUOTENAME()然后输出该值,然后PARSENAME()是QUOTENAME()ed 值并输出它。
结果非常有趣:
OriginalText_1 OriginalText_2 OriginalText_3 OriginalText_4
------------------------ ------------------------ ------------------------ ------------------------
Test [Test] Test.dbo.test [Test].[dbo].[test]
(1 row(s) affected)
QuotedText_1 QuotedText_2 QuotedText_3 QuotedText_4
------------------------ ------------------------ ------------------------ ------------------------
'Test' '[Test]' 'Test.dbo.test' '[Test].[dbo].[test]'
(1 row(s) affected)
Parsed_QuotedText_1 Parsed_QuotedText_2 Parsed_QuotedText_3 Parsed_QuotedText_4
------------------------ ------------------------ ------------------------ ------------------------
'Test' NULL test' NULL
(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
当基本文本Test.dbo.test( OriginalText_3 ) 传递给QUOTENAME()函数时,它会转换为:'Test.dbo.test'( QuotedText_3 )
当QuotedText_3串'Test.dbo.test'上,以传递PARSENAME()函数它被转换成:test'(Parsed_QuotedText_3)
看来我已经证明了超立方体??的论文是错误的,我认为可以安全地声明该函数PARSENAME()不是 的逆函数QUOTENAME()。
基于Aaron Bertrand在这里的反馈方括号的代码[ ](添加到原始脚本)
[ ]-- checking the results for [ brackets
SELECT @Text2Quote_1 AS OriginalText_1,
@Text2Quote_2 AS OriginalText_2,
@Text2Quote_3 AS OriginalText_3,
@Text2Quote_4 AS OriginalText_4
SELECT QUOTENAME(@Text2Quote_1,@QuoteChar_2) AS QuotedText_1,
QUOTENAME(@Text2Quote_2,@QuoteChar_2) AS QuotedText_2,
QUOTENAME(@Text2Quote_3,@QuoteChar_2) AS QuotedText_3,
QUOTENAME(@Text2Quote_4,@QuoteChar_2) AS QuotedText_4
select PARSENAME(QUOTENAME(@Text2Quote_1,@QuoteChar_2),@ParseParam) AS Parsed_QuotedText_1,
PARSENAME(QUOTENAME(@Text2Quote_2,@QuoteChar_2),@ParseParam) AS Parsed_QuotedText_2,
PARSENAME(QUOTENAME(@Text2Quote_3,@QuoteChar_2),@ParseParam) AS Parsed_QuotedText_3,
PARSENAME(QUOTENAME(@Text2Quote_4,@QuoteChar_2),@ParseParam) AS Parsed_QuotedText_4
Run Code Online (Sandbox Code Playgroud)
[ ]OriginalText_1 OriginalText_2 OriginalText_3 OriginalText_4
------------------------ ------------------------ ------------------------ ------------------------
Test [Test] Test.dbo.test [Test].[dbo].[test]
(1 row(s) affected)
QuotedText_1 QuotedText_2 QuotedText_3 QuotedText_4
------------------------ ------------------------ ------------------------ ------------------------
[Test] [[Test]]] [Test.dbo.test] [[Test]].[dbo]].[test]]]
(1 row(s) affected)
Parsed_QuotedText_1 Parsed_QuotedText_2 Parsed_QuotedText_3 Parsed_QuotedText_4
------------------------ ------------------------ ------------------------ ------------------------
Test [Test] Test.dbo.test [Test].[dbo].[test]
(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
并完成双引号的代码
"-- checking the results for [ brackets
SELECT @Text2Quote_1 AS OriginalText_1,
@Text2Quote_2 AS OriginalText_2,
@Text2Quote_3 AS OriginalText_3,
@Text2Quote_4 AS OriginalText_4
SELECT QUOTENAME(@Text2Quote_1,@QuoteChar_3) AS QuotedText_1,
QUOTENAME(@Text2Quote_2,@QuoteChar_3) AS QuotedText_2,
QUOTENAME(@Text2Quote_3,@QuoteChar_3) AS QuotedText_3,
QUOTENAME(@Text2Quote_4,@QuoteChar_3) AS QuotedText_4
select PARSENAME(QUOTENAME(@Text2Quote_1,@QuoteChar_3),@ParseParam) AS Parsed_QuotedText_1,
PARSENAME(QUOTENAME(@Text2Quote_2,@QuoteChar_3),@ParseParam) AS Parsed_QuotedText_2,
PARSENAME(QUOTENAME(@Text2Quote_3,@QuoteChar_3),@ParseParam) AS Parsed_QuotedText_3,
PARSENAME(QUOTENAME(@Text2Quote_4,@QuoteChar_3),@ParseParam) AS Parsed_QuotedText_4
Run Code Online (Sandbox Code Playgroud)
"OriginalText_1 OriginalText_2 OriginalText_3 OriginalText_4
------------------------ ------------------------ ------------------------ ------------------------
Test [Test] Test.dbo.test [Test].[dbo].[test]
(1 row(s) affected)
QuotedText_1 QuotedText_2 QuotedText_3 QuotedText_4
------------------------ ------------------------ ------------------------ ------------------------
"Test" "[Test]" "Test.dbo.test" "[Test].[dbo].[test]"
(1 row(s) affected)
Parsed_QuotedText_1 Parsed_QuotedText_2 Parsed_QuotedText_3 Parsed_QuotedText_4
------------------------ ------------------------ ------------------------ ------------------------
Test [Test] Test.dbo.test [Test].[dbo].[test]
(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
根据ypercube™的反馈和Aaron Bertrand的新反馈,我们得出了共同的结论
PARSENAME()是QUOTENAME()如果满足以下条件的倒数:
PARSENAME(x,1)-1(QUOTENAME(x,q))哪里q={1,2}和x='{'any_string_value'}