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

Fab*_*ied 7 t-sql 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]
Run Code Online (Sandbox Code Playgroud)

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

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

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

Fab*_*ied 14

这是我最终使用的内容:

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

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

谢谢你们所有的好答案!


ibr*_*ram 5

尝试这个:

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