2012-10-23 13 views
11

Ho la seguente descrizione: "Nome prodotto produttore di campioni XYZ - Dimensioni" e desidero ottenere solo il valore 'Nome prodotto XYZ' da questo. Se questa fosse solo una riga, non avrei alcun problema usando solo SUBSTRING ma ho migliaia di record e sebbene il valore iniziale di Sample Product Maker sia lo stesso per tutti i prodotti, il nome prodotto potrebbe essere diverso e non voglio nulla dopo il trattino.Parametro di lunghezza non valido passato alla funzione SINISTRA o SUBSTRING

Quello che ho finora ha generato l'errore nell'intestazione di questa domanda.

SELECT i.Itemid, 
     RTRIM(LTRIM(SUBSTRING(i.ShortDescription, 25, (SUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25)))))) AS ProductDescriptionAbbrev, 
     CHARINDEX('-', i.ShortDescription, 0) - 25 as charindexpos 
FROM t_items i 

sto ottenendo 'tipo di dati argomento varchar è valido per l'argomento 3 della funzione sottostringa'

Come potete vedere, sto ottenendo il valore per l'ultima riga l'istruzione SQL, ma quando provo e collegalo alla funzione SUBSTRING e ricevo vari problemi.

risposta

18

È probabile che siano presenti righe in cui manca "-", il che causa la errore. Prova questo ...

SELECT i.Itemid, 
    SUBSTRING(i.ShortDescription, 22, CHARINDEX('-', i.ShortDescription+'-', 22)) AS ProductDescriptionAbbrev, 
FROM t_items i 
+1

L'errore riportato ('Tipo di dati di argomento varchar non valido per l'argomento 3 della funzione di sottostringa') si basa sulla sintassi dell'istruzione SQL dell'OP, non sui dati recuperati. – HABO

+0

Non cercare la riga in questione solo nei dati recuperati. Può trovarsi nel set di dati sottostante prima della clausola WHERE. Ciò rende difficile trovare la riga offendente, ma questo metodo lo risolve in entrambi gli eventi. – pghcpa

1

La prima chiamata a SUBSTRING specifica una lunghezza di SUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25)).

Si potrebbe provare:

declare @t_items as Table (ItemId Int Identity, ShortDescription VarChar(100)) 
insert into @t_items (ShortDescription) values 
    ('Sample Product Maker Product Name XYZ - Size') 

declare @SkipLength as Int = Len('Sample Product Maker') 

select ItemId, 
    RTrim(LTrim(Substring(ShortDescription, @SkipLength + 1, CharIndex('-', ShortDescription, @SkipLength) - @SkipLength - 1))) as ProductDescriptionAbbrev 
    from @t_items 
+0

È una risposta? Ho provato ogni sorta di cose per farlo funzionare. Idealmente avrei il charindexpos come terzo argomento della frase precedente ma non ha funzionato neanche. – brianhevans

1

Si potrebbe anche togliere il testo Sample Product Maker e passare da lì:

SELECT RTRIM(LEFT(
    LTRIM(REPLACE(i.ShortDescription, 'Sample Product Maker', '')), 
     CHARINDEX('-', LTRIM(REPLACE(i.ShortDescription, 'Sample Product Maker', 
    ''))) - 1)) 
AS ShortDescription 
+0

Questo mi porta esattamente lo stesso problema che avevo prima e non è proprio quello che stavo chiedendo .... – brianhevans

+1

No, non lo è. Questo ti dà il risultato corretto. Il tuo problema originale era usare una stringa invece di una int per il 3 ° parm della prima SUBSTRING. E, partendo dalla posizione 25 anziché dalla 22. – GilM

+0

La risposta a questa domanda era basata sul fatto che alcune delle mie stringhe non avevano un "-" quindi restituivo un valore negativo alla sottostringa e non funzionava. Peccato che ci fosse un descrittore di errori migliore.grazie – brianhevans

0

Sembra che si desidera qualcosa di simile (22, non 25):

SELECT i.Itemid, 
     RTRIM(LTRIM(SUBSTRING(i.ShortDescription, 22, CHARINDEX('-', i.ShortDescription)-22))) AS ProductDescriptionAbbrev, 
     CHARINDEX('-', i.ShortDescription)-22 as charindexpos 
FROM t_items i 
1

Il problema è che la chiamata esterna al SUBSTRING sta passando un tipo di dati di carattere dall'interno SUBSTRING chiamata nel terzo parametro.

            +--This call does not return an integer type 
SELECT i.Itemid,         V 
    RTRIM(LTRIM(SUBSTRING(i.ShortDescription, 25, (SUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25)))))) AS ProductDescriptionAbbrev, 
    CHARINDEX('-', i.ShortDescription, 0) - 25 as charindexpos 
FROM t_items i 

Il terzo parametro deve valutare la lunghezza desiderata. Forse intendevi LEN(SUBSTRING(...))?

0

desiderato:

LEFT(i.ShortDescription, isnull(nullif(CHARINDEX('-', i.ShortDescription),0) - 1, 8000)) 

Si noti che una buona pratica è quella di avvolgere charindex(...) 's e patindex(...)' s con nullif(...,0), e quindi gestire il caso nulla se lo si desidera (a volte nulla è il risultato giusto, in questo caso vogliamo tutto il testo quindi abbiamo isnull(...,8000) per la lunghezza che vogliamo).

Problemi correlati