Cncatenare stringhe con carattere /

martedì 25 settembre 2007 - 11.49

fabiof Profilo | Newbie

Salve,

ho un problema con la concatenazione di 2 stringhe in una stored procedure, di cui la seconda stringa incomincia con il simbolo /

l'errore che genera è:
Conversione non riuscita durante la conversione del valore varchar '2952/H' nel tipo di dati int.

la riga della StoredProcedure che genera l'errore è
DECLARE @AProgPrecedente as varchar(16)

SELECT @AProgPrecedente = CAST(@ProgPrecedente as varchar(16)) + CONVERT(varchar(16),@suffisso)

in pratica CAST(@ProgPrecedente as varchar(16)) vale 2952 mentre CONVERT(varchar(16),@suffisso) ha valore /H
questa seconda stringa che incomincia con / genera l'errore.

Non è possibile concatenare questo carattere / in SQL ?
Grazie a chiunque possa darmi una mano

lbenaglia Profilo | Guru

>l'errore che genera è:
>Conversione non riuscita durante la conversione del valore varchar
>'2952/H' nel tipo di dati int.
Dal messaggio d'errore sembra che tu stia cercando di convertire implicitamente o esplicitamente la stringa '2952/H' in un intero

>DECLARE @AProgPrecedente as varchar(16)
>
>SELECT @AProgPrecedente = CAST(@ProgPrecedente as varchar(16))
>+ CONVERT(varchar(16),@suffisso)
>
>in pratica CAST(@ProgPrecedente as varchar(16)) vale 2952 mentre
>CONVERT(varchar(16),@suffisso) ha valore /H
>questa seconda stringa che incomincia con / genera l'errore.
>
>Non è possibile concatenare questo carattere / in SQL ?

Quali sono i data type delle variabili @ProgPrecedente e @suffisso?
Puoi postare un esempio COMPLETO?

>Grazie a chiunque possa darmi una mano
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

fabiof Profilo | Newbie

Ciao, i data type sono i seguenti:

Es:
DECLARE
@ProgPrecedente as int,
@suffisso varchar(16),
@AProgPrecedente as varchar(16)

SELECT @suffisso='/H'
SELECT @ProgPrecedente = 2952
SELECT @AProgPrecedente = CAST(@ProgPrecedente as varchar(16)) + CONVERT(varchar(16),@suffisso)


so che effettuare il Convert di @suffisso non ha molto senso perchè è già un varchar, ma era l'ennesimo tentativo.
il problema è che, se la seconda stringa incomincia con il carattere / (a me serve per identificare alcuni documenti) allora presenta quell'errore sopra specificato.
Non c'è un modo per riuscire a concatenare 2 stringhe di cui la seconda incominciao con il carattere /?

lbenaglia Profilo | Guru

>Non c'è un modo per riuscire a concatenare 2 stringhe di cui
>la seconda incominciao con il carattere /?

A me funziona tutto correttamente:

DECLARE @ProgPrecedente as int, @suffisso varchar(16), @AProgPrecedente as varchar(16) SET @suffisso = '/H' SET @ProgPrecedente = 2952 SET @AProgPrecedente = CAST(@ProgPrecedente as varchar) + @suffisso SELECT @AProgPrecedente AS Concatenazione /* Output: Concatenazione ---------------- 2952/H (1 row(s) affected) */

Il problema di cast lo avresti se tentassi di concatenare @ProgPrecedente (int) a @suffisso (varchar).
Dato che il data type int ha una precedenza superiore rispetto a varchar, SQL Server tenderà a castare implicitamente la variabile varchar a int ma se il contenuto non è numerico otterrai l'errore riportato nel primo post:

/* Tentativo di cast da char a int fallito */ SELECT 10 + '/5' AS Concatenazione; /* Output Concatenazione -------------- Msg 245, Level 16, State 1, Line 1 Conversion failed when converting the varchar value '/5' to data type int. */ /* Cast impilcito da char a int */ SELECT 10 + '5' AS Concatenazione; /* Output: Concatenazione -------------- 15 (1 row(s) affected) */ /* Cast esplicito da int a char */ SELECT CAST(10 AS char(2)) + '/5' AS Concatenazione; /* Output Concatenazione -------------- 10/5 (1 row(s) affected) */

Per maggiori info leggi questo paragrafo dei Books Online:

"Data Type Precedence (Transact-SQL)"
http://msdn2.microsoft.com/en-us/library/ms190309.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

fabiof Profilo | Newbie

Ciao,
ti ringrazio per le dritte, sto già dando un'occhiata all'articolo che mi hai dato.
In effetti sembra funzionare, unico problema è che il valore concatenato poi lo utilizzo in un cursore
per tirare fuori dei dati. E proprio qui mi propone il fatidico errore di conversione.
Per essere più chiaro riporto la Stored Procedure dove utilizzo il cursore e dove da l'errore.
La cosa stranissima che non riesco ha spiegare è che ho provato a passare al cursore una stringa tipo '2952/G'
e in questo modo funziona, cioè qualsiasi carattere dopo la / funziona tranne il carattere H.


ALTER PROCEDURE [dbo].[IncrementaProgressivo]
( @ctipodoc smallint,
@cazienda smallint,
@prog varchar(255) OUTPUT
)
AS
SET NOCOUNT ON;
BEGIN
BEGIN TRAN
DECLARE
@ProgAttuale int,
@Anumdoc int,
@Ok as bit,
@ProgPrecedente as int,
@AProgPrecedente as varchar(16),
@lunghezza int,
@suffisso varchar(16)

DECLARE Progressivi INSENSITIVE CURSOR FOR
SELECT
nprog
FROM prog WITH (ROWLOCK, HOLDLOCK)
WHERE ctipodoc= @ctipodoc AND cazienda =@cazienda
FOR READ ONLY

OPEN Progressivi

FETCH NEXT FROM Progressivi INTO
@ProgAttuale

IF (@@FETCH_STATUS = -1) or (@ProgAttuale = 0)
SET @prog = 0
ELSE
BEGIN
SET @suffisso = '/H'
SET @ProgPrecedente = 2954
SET @AProgPrecedente = CAST(@ProgPrecedente as varchar) + @suffisso

SELECT @AProgPrecedente

-- controllo se il documento con progressivo precedente esiste
DECLARE DocumentoPrecedente INSENSITIVE CURSOR FOR
SELECT
anumdoc
FROM documenti WITH (ROWLOCK, HOLDLOCK)
WHERE ctipodoc= @ctipodoc AND cazienda=@cazienda
-- RIGA DI CODICE INCRIMINATA------------------------------------------------------------
AND anumdoc= @AProgPrecedente
-------------------------------------------------------------------------------
-- AND anumdoc= '2954/G'
AND year(ddocum)= year(getdate())
FOR READ ONLY

OPEN DocumentoPrecedente

FETCH NEXT FROM DocumentoPrecedente INTO
@Anumdoc

IF (@@FETCH_STATUS = -1) or (@Anumdoc = 0)
BEGIN
ROLLBACK TRAN
SELECT @prog = @AProgPrecedente
RETURN len(@AProgPrecedente)
END

CLOSE DocumentoPrecedente
DEALLOCATE DocumentoPrecedente
END
CLOSE Progressivi
DEALLOCATE Progressivi

SELECT @prog = @AProgPrecedente
COMMIT TRAN
END
SET NOCOUNT OFF


Ti ringrazio comunque per il supporto datomi
grazie

lbenaglia Profilo | Guru

>-- RIGA DI CODICE INCRIMINATA--------------------------------------
>AND anumdoc= @AProgPrecedente
>-------------------------------------------------------------------------------

Se il data type della colonna "anumdoc" è numerico (come il nome suggerisce), SQL Server tenderà a convertire la stringa contenuta in @AProgPrecedente in un valore numerico, causando l'eccezione di cast.

>grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5