T-SQL:如何获取字符串的确切长度?

时间:2010-09-20 10:04:59

标签: tsql string varchar nvarchar

我正在为我没有预先提供数据类型信息的表生成T-SQL SELECT语句。在这些语句中,我需要执行依赖于表列原始值长度的字符串操作操作。

一个例子(但不是唯一的例子)是在字符串中的特定位置插入一些文本,包括在末尾插入它的选项:

SELECT 
  CASE WHEN (LEN ([t0].[Product] = 8) 
    THEN [t0].[Product] + 'test' 
    ELSE STUFF ([t0].[Product], 8, 0, 'test') 
  END
FROM [OrderItem] [t0]

(CASE WHEN + LEN是必需的,因为STUFF不允许我在字符串的末尾插入文本。)

问题是LEN排除了尾随空白,这将破坏计算。 我知道我可以使用DATALENGTH,它不排除尾随空格,但我无法将DATALENGTH返回的字节转换为STUFF所需的字符,因为我不知道Product列是varchar还是nvarchar类型。

那么,如何在没有关于正在使用的字符串数据类型的前期信息的情况下生成依赖于字符串的确切长度的SQL语句?

5 个答案:

答案 0 :(得分:13)

以下是我最终使用的内容:

SELECT   
  CASE WHEN ((LEN ([t0].[Product] + '#') - 1) = 8)   
    THEN [t0].[Product] + 'test'   
    ELSE STUFF ([t0].[Product], 8, 0, 'test')   
  END  
FROM [OrderItem] [t0]  

测量表明LEN(... +'#') - 1技巧与LEN(...)的速度大致相同。

感谢所有好的答案!

答案 1 :(得分:4)

试试这个:

SELECT 
  CASE WHEN (LEN (REPLACE([t0].[Product],' ', '#') = 8) 
    THEN [t0].[Product] + 'test' 
    ELSE STUFF ([t0].[Product], 8, 0, 'test') 
  END
FROM [OrderItem] [t0]

答案 2 :(得分:3)

您无法查找系统表中列的类型信息吗?

如果没有,则确定某列是varchar还是nvarchar,这样就可以了。

create table #test
(
c varchar(50),
n nvarchar(50)
)

insert into #test values ('1,2,3,4    ',N'1,2,3,4,5      ')

SELECT
       CASE
              WHEN datalength(CAST(c AS nvarchar(MAX))) = datalength(c)
              THEN 'c is nvarchar'
              ELSE 'c is char'
       END,
       CASE
              WHEN datalength(CAST(n AS nvarchar(MAX))) = datalength(n)
              THEN 'n is nvarchar'
              ELSE 'n is char'
       END
FROM   #test

答案 3 :(得分:1)

使用DATALENGTHSQL_VARIANT_PROPERTY

SELECT 
  CASE 
    WHEN 8
      = DATALENGTH([t0].[Product]) 
      / CASE SQL_VARIANT_PROPERTY([t0].[Product],'BaseType') WHEN 'nvarchar' THEN 2 ELSE 1 END
    THEN [t0].[Product] + 'test' 
    ELSE STUFF ([t0].[Product], 8, 0, 'test') 
  END
FROM [OrderItem] [t0]

答案 4 :(得分:0)

如果没有前导空格,len(reverse(column_name))将为您提供列长。