Wählen Sie nur die ersten vier Zeilen von SQL-Textfeld
Frage
SQL Server 2008 Express >> Visual Web Developer >> C #
Ich bin Aufzeichnungen aus der Tabelle wie folgt ziehen:
SELECT Name, Category, Review FROM ReviewTable
Das funktioniert gut, aber der Review-Feld Typ in SQL Server ist ein Text und ist sehr lang (man denke an einen Zeitungsartikel).
Ich mag nur für jede Zeile, die ersten vier Zeilen aus dem Bewertungsbereich ziehen und sie in meinem Repeater-Steuerelement angezeigt werden soll. Diese Linien werden wie ein Teaser des Artikels sein.
Ist das möglich? Wie kann es erreicht werden?
Lösung
Dies gibt diese ersten 1000 Zeichen aus dem Bericht.
SELECT Name, Category, CAST(Review AS VARCHAR(1000) FROM ReviewTable
Wenn Sie die ersten vier Zeilen, die Sie benötigen, müssen einige Split-Funktion zu verwenden. Das könnte funktionieren:
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
Verbrauch: select * from dbo.split('aaa**bbbb**CCCC**dddd**eeee**dffff**ggggg', '**', 4)
Andere Tipps
Nun kann der erste für die Linien etwas schwieriger sein, aber warum nicht nur die ersten 250 Zeichen setzen oder so?
SELECT Name, Category, SubString(Review, 1, 250) AS Review FROM ReviewTable
Wenn Ihr Datenbankserver im gleichen lokalen Netzwerk wie Ihr Webserver ist, denke ich, dass ich wahrscheinlich das gesamte Feld wählen würde, da man es überhaupt ist erreichbar. Sie werden immer noch einen Nachschlag für den Zugriff alle Daten in diesem Bereich, so SQL-Performance-weise zum Auffinden der Daten, die ein Nicht-Thema ist zu tun. Der einzige Nachteil des gesamten Feldes Abrufen wäre die Menge der Daten zwischen den Servern übergeben. Also: wenn sie im selben Netzwerk sind, dann würde ich sagen, dass dies auf jeden Fall billiger wäre mit jedem Datensatz bei der Auswahl als Manipulation. Es gibt Ihnen auch die Möglichkeit, Ihre Antwort zwischenzuspeichern, so dass Sie nicht die Datenbank erneut treffen müssen, wenn der Benutzer die Vollversion des Textes zu sehen.
Aber, um Ihre Frage zu beantworten, sollte der folgende es wahrscheinlich tun, obgleich es ziemlich klebrig aussieht
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, ja, wirklich, ich würde mein erster Absatz betrachten