我正在为没有任何数据类型信息的表生成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语句?

最佳答案

这是我最终使用的内容:

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(...)的速度大致相同。

感谢所有的好的答案!

09-11 19:59
查看更多