Pregunta

Sql Server 2008 Express > > Desarrollador web visual > > C #

Estoy sacando registros de la tabla de esta manera:

SELECT Name, Category, Review FROM ReviewTable

Esto funciona bien, pero el Tipo de campo de Revisión en SQL Server es de texto y es muy largo (piense en un artículo de una revista).

Solo quiero extraer las primeras cuatro líneas del campo Revisar para cada fila y mostrarlas en mi control de repetidor. Estas líneas serán como un teaser del artículo.

¿Es esto posible? ¿Cómo se puede lograr?

¿Fue útil?

Solución

Esto devolverá estos primeros 1000 caracteres de la revisión.

SELECT Name, Category, CAST(Review AS VARCHAR(1000) FROM ReviewTable

Si debe tener las primeras 4 líneas, necesita usar alguna función de división. Esto podría funcionar:

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

Uso: select * from dbo.split ('aaa ** bbbb ** CCCC ** dddd ** eeee ** dffff ** ggggg', '**', 4)

Otros consejos

Bueno, la primera para las líneas puede ser un poco más difícil, pero ¿por qué no colocas los primeros 250 caracteres más o menos?

SELECT Name, Category, SubString(Review, 1, 250) AS Review FROM ReviewTable

Si su servidor de base de datos está en la misma red local que su servidor web, creo que probablemente seleccionaría todo el campo, ya que está accediendo a él. Aún tendrá que hacer una búsqueda para acceder a los datos de cualquier en ese campo, por lo que no hay problema con el rendimiento de SQL para encontrar los datos. El único inconveniente de recuperar todo el campo sería la cantidad de datos que pasan entre los servidores. Por lo tanto: si están en la misma red, diría que esto definitivamente sería más barato que manipular cada registro durante la selección. También le brinda la capacidad de almacenar en caché su respuesta, para que no tenga que volver a golpear la base de datos cuando el usuario quiera ver la versión completa del texto.

Pero, para responder a tu pregunta, lo que sigue a continuación probablemente debería hacerlo, aunque parezca más pegajoso

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

... hrrm, sí, realmente, consideraría mi primer párrafo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top