Выберите только первые четыре строки в текстовом поле Sql - PullRequest
0 голосов
/ 27 ноября 2009

Sql Server 2008 Express >> Визуальный веб-разработчик >> C #

Я вытаскиваю записи из таблицы вот так:

SELECT Name, Category, Review FROM ReviewTable

Это отлично работает, но поле «Тип обзора» в SQL Server является текстовым и очень длинным (вспомним статью в журнале).

Я только хочу вытащить первые четыре строки из поля Просмотр для каждой строки и отобразить их в моем элементе управления повторителем. Эти строки будут похожи на тизер статьи.

Возможно ли это? Как это можно сделать?

Ответы [ 3 ]

1 голос
/ 27 ноября 2009

Ну, первое для строк может быть немного сложнее, но почему бы вам просто не вставить первые 250 символов или около того?

SELECT Name, Category, SubString(Review, 1, 250) AS Review FROM ReviewTable
1 голос
/ 27 ноября 2009

Это вернет первые 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)

0 голосов
/ 27 ноября 2009

Если ваш сервер базы данных находится в той же локальной сети, что и ваш веб-сервер, я думаю, что, вероятно, я бы выбрал все поле, поскольку вы обращаетесь к нему вообще. Вам все равно придется выполнить поиск, чтобы получить доступ к любым данным в этом поле, поэтому 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

... хм, да, правда, я бы рассмотрел мой первый абзац

...