当我在存储过程中使用PARSENAME
函数时,有时会返回正确的值,有时会返回NULL
值。我在这里有点困惑是什么原因?
SELECT parsename(Replace('the big bang Theory',' ','.'),4)
答案 0 :(得分:1)
PARSENAME(Transact-SQL)返回对象名称的指定部分。 可以检索的对象部分是对象名称, 所有者名称,数据库名称和服务器名称。
PARSENAME('object_name',object_piece)参数'object_name' 是要为其检索指定对象的对象的名称 部分。 object_name是sysname。这个参数是一个 可选的限定对象名称。如果对象名称的所有部分都是 限定,这个名称可以有四个部分:服务器名称,
数据库名称,所有者名称和对象名称。
object_piece是要返回的对象部件。 object_piece是类型 int,并且可以具有以下值:1 =对象名称2 =模式名称3 = 数据库名称4 =服务器名称
SELECT PARSENAME('[Server].database.schema.table', 1) AS 'Object Name';
SELECT PARSENAME('[Server].database.schema.table', 2) AS 'Schema Name';
SELECT PARSENAME('[Server].database.schema.table', 3) AS 'Database Name';
SELECT PARSENAME('[Server].database.schema.table', 4) AS 'Server Name';
SELECT PARSENAME('database..table', 1) AS 'Object Name';
SELECT PARSENAME('database..table', 2) AS 'Schema Name'; -- will return NULL
SELECT PARSENAME('database..table', 3) AS 'Database Name';
SELECT PARSENAME('database..table', 4) AS 'Server Name'; -- will return NULL
答案 1 :(得分:0)
首先,PARSENAME()
旨在解析object_name
类型的SYSNAME
。
可能的情况:
SELECT c, PARSENAME(REPLACE(sub.c, ' ', '.'), 4) AS part
FROM (
SELECT 'a b c d e' -- more than 4 parts
UNION ALL
SELECT 'a b c d'
UNION ALL
SELECT REPLICATE('a', 129) + ' b c d' -- too long part
UNION ALL
SELECT REPLICATE('a', 128) + ' b c d'
UNION ALL
SELECT 'a b c d' -- more than one space
UNION ALL
SELECT CAST('a b c d' AS CHAR(30)) -- padded with spaces
)sub(c)
<强> Rextester Demo 强>
请记住,a.b.c.d.e
不是有效的object_name。 SYSNAME
也是NVARCHAR(128)
的别名,因此较长的部分无效。
重点是,当您使用它来执行不同的工作(解析任何用户字符串)时,您可能会收到错误。