Выберите только первые четыре строки в текстовом поле Sql
Вопрос
Sql Server 2008 Express > > Visual Web Developer > > C # р>
Я вытаскиваю записи из таблицы следующим образом:
SELECT Name, Category, Review FROM ReviewTable
Это работает нормально, но поле «Просмотр» типа в SQL Server является текстовым и очень длинным (например, статья в журнале). Р>
Я хочу извлечь только первые четыре строки из поля Просмотр для каждой строки и отобразить их в моем элементе управления повторителем. Эти строки будут похожи на тизер статьи.
Возможно ли это? Как это можно сделать?
Решение
Это вернет первые 1000 символов из обзора.
SELECT Name, Category, CAST(Review AS VARCHAR(1000) FROM ReviewTable
Если у вас должны быть первые 4 строки, вам нужно использовать некоторую функцию разделения. Это может сработать:
CREATE FUNCTION [dbo].[Split]
(
@SearchString VARCHAR(8000),
@Separator VARCHAR(5),
@MaxItems INT
)
RETURNS @strtable TABLE (strval VARCHAR(8000))
AS
BEGIN
DECLARE @tmpStr VARCHAR(8000), @intSeparatorLength INT, @counter int
IF @MaxItems IS NULL
SET @MaxItems = 2147483647 -- max int
SET @intSeparatorLength = LEN(@Separator)
SET @Counter = 0
SET @tmpStr = @SearchString
WHILE 1=1 BEGIN
INSERT INTO @strtable VALUES ( SUBSTRING(@tmpStr, 0 ,CHARINDEX(@Separator, @tmpStr)))
SET @tmpStr = SUBSTRING(@tmpStr,CHARINDEX(@Separator,@tmpStr)+LEN(@Separator),8000)
SET @counter = @counter + 1
IF (CHARINDEX(@Separator,@tmpStr) < 1 OR @counter >= @MaxItems)
BREAK
END
RETURN
END
Использование: select * from dbo.split ('aaa ** bbbb ** CCCC ** dddd ** eeee ** dffff ** ggggg', '**', 4)
Другие советы
Ну, первое для строк может быть немного сложнее, но почему бы вам просто не вставить первые 250 символов или около того?
SELECT Name, Category, SubString(Review, 1, 250) AS Review FROM ReviewTable
Если ваш сервер базы данных находится в той же локальной сети, что и ваш веб-сервер, я думаю, что я бы, вероятно, выбрал все поле, поскольку вы обращаетесь к нему вообще. Вам все равно придется выполнить поиск, чтобы получить доступ к любым данным в этом поле, поэтому для поиска данных sql проблем не возникает. Единственным недостатком получения всего поля будет объем данных, передаваемых между серверами. Таким образом: если они находятся в одной сети, я бы сказал, что это определенно дешевле, чем подделка каждой записи во время выбора. Это также дает вам возможность кэшировать ваш ответ, чтобы вам не приходилось снова обращаться к базе данных, когда пользователь хочет увидеть полную версию текста.
Но, чтобы ответить на ваш вопрос, нижеследующее, вероятно, должно это сделать, хотя это выглядит довольно липко
SELECT Name, Category, left(convert(varchar(8000), Review), charindex('\n', convert(varchar(8000), Review), charindex('\n', convert(varchar(8000), Review), charindex('\n', convert(varchar(8000), Review), charindex('\n', convert(varchar(8000), Review))+1)+1)+1)-1) FROM ReviewTable
... хм, да, правда, я бы рассмотрел мой первый абзац