T-SQL:从text或ntext列中选择前n个字符

p.c*_*ell 8 t-sql sql-server

考虑一种情况,您希望从表中提取最后的x个条目.我们想要的列包含有关产品的推荐.出于性能原因,我们只想从推荐书中获取前50个字符.该列名为TestimonialText,属于类型text.

考虑这个简洁的T-SQL片段:

SELECT TOP 10
    C.FirstName + ' ' + C.LastName AS CustomerName
    ,LEFT(C.TestimonialText,50) AS TestimonialSnippet
    ,C.TestimonialDate

FROM Customer AS C  
ORDER BY C.TestimonialDate DESC
Run Code Online (Sandbox Code Playgroud)

这会产生错误:

左参数的参数1的参数数据类型文本无效.

问题:如何只提取text或ntext列的前几个n个字符?

nor*_*ole 12

我认为SUBSTRING将是一个更好的选择.试试这个:

SELECT TOP 10
    C.FirstName + ' ' + C.LastName AS CustomerName
    ,SUBSTRING(C.TestimonialText,1,50) AS TestimonialSnippet
    ,C.TestimonialDate
FROM Customer AS C  
ORDER BY SUBSTRING(C.TestimonialText,1,50) DESC
Run Code Online (Sandbox Code Playgroud)


Ser*_*sev 8

如果使用SQL Server 2005或更高版本,请不要使用text数据类型,因为它已被删除.使用varchar(max)或nvarchar(max).所有字符串函数都可以.在这里阅读更多内容:http://msdn.microsoft.com/en-us/library/ms178158.aspx


bea*_*ach 6

你在找这样的东西吗?请注意SELECT语句中的CAST(C.TestimonialText AS VARCHAR(50)).

SELECT TOP 10
    C.FirstName + ' ' + C.LastName AS CustomerName,
    CAST(C.TestimonialText AS VARCHAR(50)) AS TestimonialSnippet,
    C.TestimonialDate
FROM Customer AS C  
ORDER BY C.TestimonialDate DESC
Run Code Online (Sandbox Code Playgroud)

这是一些测试数据

测试数据设置

create table #t (mytext text)
insert into #t VALUES ('1234567890')
insert into #t VALUES ('123')

SELECT
  mytext,
  CAST(mytext as varchar(5)) AS Snippet
FROM #t
Run Code Online (Sandbox Code Playgroud)

结果

mytext     Snippet
---------- -------
1234567890 12345
123        123
Run Code Online (Sandbox Code Playgroud)