PARSENAME函数表现得很糟糕

时间:2017-07-17 08:29:29

标签: sql sql-server tsql split

当我在存储过程中使用PARSENAME函数时,有时会返回正确的值,有时会返回NULL值。我在这里有点困惑是什么原因?

SELECT parsename(Replace('the big bang Theory',' ','.'),4) 

2 个答案:

答案 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)的别名,因此较长的部分无效。

重点是,当您使用它来执行不同的工作(解析任何用户字符串)时,您可能会收到错误。