8

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

4

5 回答 5

14

这是我最终使用的:

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

感谢所有的好答案!

于 2010-09-23T13:51:03.220 回答
5

试试这个:

SELECT 
  CASE WHEN (LEN (REPLACE([t0].[Product],' ', '#') = 8) 
    THEN [t0].[Product] + 'test' 
    ELSE STUFF ([t0].[Product], 8, 0, 'test') 
  END
FROM [OrderItem] [t0]
于 2010-09-20T10:34:12.107 回答
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
于 2010-09-20T10:31:55.777 回答
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]
于 2010-09-20T14:34:25.743 回答
0

如果没有前导空格,len(reverse(column_name))会给你列的长度。

于 2012-06-21T00:10:44.507 回答