Selecionar apenas quatro primeiras linhas, a partir de campo de texto Sql
Pergunta
SQL Server 2008 Express >> Visual Web Developer >> C #
Eu estou puxando registros fora da tabela como esta:
SELECT Name, Category, Review FROM ReviewTable
Isso funciona bem, mas o campo avaliação Tipo no SQL Server é um texto e é muito longo (acho que um artigo de revista).
Eu só quero puxar as primeiras quatro linhas do campo revisão para cada linha, e exibi-los em meu controle repetidor. Estas linhas serão como um teaser do artigo.
Isso é possível? Como é que pode ser feito?
Solução
Isso irá retornar este primeiro 1000 caracteres a partir da revisão.
SELECT Name, Category, CAST(Review AS VARCHAR(1000) FROM ReviewTable
Se você deve ter as 4 primeiras linhas você precisa usar alguma função split. Isso poderia 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)
Outras dicas
Bem, a primeira para as linhas pode ser um pouco mais difícil, mas por que você não apenas colocar para fora os primeiros 250 caracteres ou menos?
SELECT Name, Category, SubString(Review, 1, 250) AS Review FROM ReviewTable
Se o seu servidor de banco de dados está na mesma rede local que o servidor web, eu acho que eu provavelmente selecionar o campo inteiro, desde que você está acessando-lo em tudo. Você ainda vai ter que fazer uma pesquisa para o acesso qualquer dados nesse campo, então sql em termos de performance para encontrar os dados é uma não-questão. A única desvantagem de recuperar todo o campo seria a quantidade de dados transmitidos entre os servidores. Assim: se eles estão na mesma rede, eu diria que esta seria sem dúvida mais barato do que mexer com cada registro durante a seleção. Ela também lhe dá a capacidade de armazenar em cache sua resposta, de modo que você não tem que bater o banco de dados novamente quando o usuário quer ver a versão completa do texto.
Mas, para responder à sua pergunta, a seguir provavelmente deve fazê-lo, altho parece bastante brega
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, sim, realmente, eu considero meu primeiro parágrafo