Выберите только первые четыре строки в текстовом поле Sql

StackOverflow https://stackoverflow.com/questions/1807479

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top