2009-11-27 11 views
0

Sql Server 2008 Express >> de Visual Web Developer >> C#Sélectionnez seulement quatre premières lignes, du champ de texte Sql

Je tire des documents sur la table comme ceci:

SELECT Name, Category, Review FROM ReviewTable 

Cela fonctionne Bien mais le champ Revoir Type dans SQL Server est du texte et est très long (pensez à un article de magazine).

Je veux seulement tirer les quatre premières lignes du champ Review pour chaque rangée, et les afficher dans mon contrôle de répéteur. Ces lignes seront comme un teaser de l'article.

Est-ce possible? Comment peut-il être accompli?

Répondre

1

Cela retournera les 1000 premiers caractères de la révision.

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

Si vous devez avoir les 4 premières lignes, vous devez utiliser une fonction fractionnée. Cela pourrait fonctionner:

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 

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

+0

Merci pour toutes les réponses. Je pense que je vais aller dans le VARCHAR (1000). Cela semble la manière la plus logique et la plus facile d'aller. –

1

Eh bien, la première pour les lignes peut être un peu plus difficile, mais pourquoi ne pas simplement mettre les 250 premiers caractères ou alors?

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

Nitpick: la sous-chaîne ne fonctionne pas sur le type de données Texte, cast en varchar (8000) ou varchar (max) – edosoft

+0

Oh, je pensais que c'était varchar (max). Je sorte de la partie sur le type étant le texte. Merci pour l'information. –

0

Si votre serveur de base de données est dans le même réseau local que votre serveur web, je pense que je choisis sans doute le champ entier, puisque vous accédez à tout. Vous aurez toujours à faire une recherche pour accéder à toutes les données dans ce champ, donc les performances SQL pour trouver les données ne posent pas de problème. Le seul inconvénient de récupérer le champ entier serait la quantité de données transmises entre les serveurs. Donc: s'ils sont dans le même réseau, je dirais que ce serait certainement moins cher que de trafiquer chaque enregistrement pendant la sélection. Il vous donne également la possibilité de mettre en cache votre réponse, de sorte que vous n'ayez plus à cliquer sur la base de données lorsque l'utilisateur veut voir la version complète du texte.

Mais, pour répondre à votre question, le ci-dessous devrait probablement le faire, altho il semble plutôt collante

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, oui, vraiment, je considérerais mon premier paragraphe

Questions connexes