T-SQL: выбор первых n символов из текстового или текстового столбца - PullRequest
6 голосов
/ 02 августа 2009

Рассмотрим сценарий, в котором вы хотите извлечь последние 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

Это приводит к ошибке:

Текст с типом данных аргумента недопустим для аргумент 1 левой функции.

Вопрос: как извлечь только первые несколько n символов текста или столбца ntext?

Ответы [ 4 ]

11 голосов
/ 02 августа 2009

Я думаю, что 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
8 голосов
/ 02 августа 2009

Если вы используете SQL Server 2005 или выше, не используйте текстовый тип данных, потому что он ограничен. Используйте varchar (max) или nvarchar (max). Все строковые функции будут работать. Подробнее здесь: http://msdn.microsoft.com/en-us/library/ms178158.aspx

6 голосов
/ 02 августа 2009

Вы ищете что-то подобное? Обратите внимание на CAST (C.TestimonialText AS VARCHAR (50)) в инструкции SELECT.

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

Вот некоторые данные испытаний

Настройка тестовых данных

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

Результаты

mytext     Snippet
---------- -------
1234567890 12345
123        123
1 голос
/ 04 августа 2009

В основном, произошло то, что вы указали неверный тип данных для первого параметра функции LEFT. Убедитесь, что вы преобразовали тип данных text как varchar или nvarchar, тогда ваш запрос определенно работает. Вот пример, который я протестировал в SQL Server 2005

Create table #Customer

(
 firstName varchar(30)
 ,lastName varchar(30)
 ,testimonial text
 ,testimonialDate DateTime

)

GO

INSERT INTO #Customer (firstName, lastName, testimonial, testimonialDate ) VALUES('Jonhn', 'Smith', 'we really really like your product and blaha ......', getDate())
GO
INSERT INTO #Customer (firstName, lastName, testimonial , testimonialDate) VALUES('Mary', 'Toe', 'we really really like your product and blaha ......', getDate() - 3)
GO
INSERT INTO #Customer (firstName, lastName, testimonial , testimonialDate) VALUES('Amanda', 'Palin', 'we really really like your product and blaha ......', getDate() -2 )
GO

SELECT TOP 3    C.FirstName + ' ' + C.LastName AS CustomerName    ,LEFT( CAST(C.Testimonial as varchar(50)),50) AS TestimonialSnippet    ,C.TestimonialDate FROM #Customer AS C  ORDER BY C.TestimonialDate DESC
GO
Drop table #Customer
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...