2009-08-02 9 views
6

Considérons un scénario dans lequel vous souhaitez extraire les dernières entrées x d'une table. La colonne que nous voulons contient des témoignages sur un produit. Pour des raisons de performances, nous souhaitons uniquement récupérer les 50 premiers caractères du témoignage. La colonne s'appelle TestimonialText et est de type text.T-SQL: Sélection des n premiers caractères d'une colonne text ou ntext

Tenir compte cet extrait condensé de T-SQL:

SELECT TOP 10 
    C.FirstName + ' ' + C.LastName AS CustomerName 
    ,LEFT(C.TestimonialText,50) AS TestimonialSnippet 
    ,C.TestimonialDate 

FROM Customer AS C 
ORDER BY C.TestimonialDate DESC 

Cela produit une erreur:

Argument data type text is invalid for argument 1 of left function.

Question: comment extraire seulement les premiers n caractères du texte ou ntext colonne?

Répondre

10

Je pense SUBSTRIN G serait un meilleur choix. Essayez ceci:

SELECT TOP 10 
    C.FirstName + ' ' + C.LastName AS CustomerName 
    ,SUBSTRING(C.TestimonialText,1,50) AS TestimonialSnippet 
    ,C.TestimonialDate 
FROM Customer AS C 
ORDER BY SUBSTRING(C.TestimonialText,1,50) DESC 
+1

Merci Oiseau. 'SUBSTRING' est le chemin à parcourir si vous ne voulez pas lancer un' varchar'. –

8

Si vous utilisez SQL Server 2005 ou version ultérieure, n'utilisez pas de type de données texte, car il est déprimé. Utilisez varchar (max) ou nvarchar (max). Toutes les fonctions de chaîne fonctionneront. En savoir plus ici: http://msdn.microsoft.com/en-us/library/ms178158.aspx

+0

Merci Sergey, appréciez la note sur le type de données. –

6

Vous cherchez quelque chose comme ça? Notez le CAST (C.TestimonialText AS VARCHAR (50)) dans l'instruction SELECT.

SELECT TOP 10 
    C.FirstName + ' ' + C.LastName AS CustomerName, 
    CAST(C.TestimonialText AS VARCHAR(50)) AS TestimonialSnippet, 
    C.TestimonialDate 
FROM Customer AS C 
ORDER BY C.TestimonialDate DESC 

Voici quelques données de test

configuration des données de test

create table #t (mytext text) 
insert into #t VALUES ('1234567890') 
insert into #t VALUES ('123') 

SELECT 
    mytext, 
    CAST(mytext as varchar(5)) AS Snippet 
FROM #t 

Résultats

mytext  Snippet 
---------- ------- 
1234567890 12345 
123  123 
1

Fondamentalement, ce qui est arrivé, c'est que vous avez fourni un type de données invalide au premier paramètre de la fonction LEFT. Assurez-vous de lancer le type de données texte en tant que varchar ou nvarchar, puis votre requête fonctionne définitivement. Voici un exemple que j'ai testé dans le SQL Server 2005

Create table #Customer 

(
firstName varchar(30) 
,lastName varchar(30) 
,testimonial text 
,testimonialDate DateTime 

) 

GO 

INSERT INTO #Customer (firstName, lastName, testimonial, testimonialDate) VALUES('Jonhn', 'Smith', 'we really really like your product and blaha ......', getDate()) 
GO 
INSERT INTO #Customer (firstName, lastName, testimonial , testimonialDate) VALUES('Mary', 'Toe', 'we really really like your product and blaha ......', getDate() - 3) 
GO 
INSERT INTO #Customer (firstName, lastName, testimonial , testimonialDate) VALUES('Amanda', 'Palin', 'we really really like your product and blaha ......', getDate() -2) 
GO 

SELECT TOP 3 C.FirstName + ' ' + C.LastName AS CustomerName ,LEFT(CAST(C.Testimonial as varchar(50)),50) AS TestimonialSnippet ,C.TestimonialDate FROM #Customer AS C ORDER BY C.TestimonialDate DESC 
GO 
Drop table #Customer 
GO 
Questions connexes