Discussione:
errore in query UNION ALL
(troppo vecchio per rispondere)
Ammammata
2024-02-29 14:49:14 UTC
Permalink
ho preparato tre query pressoché identiche che leggono i dati di una
tabella (Delivery) presente in tre database diversi (stesso gestionale
SBO), corrispondenti a tre filiali della stessa società di gruppo

i primi due db sono sullo stesso server, il terzo è su uno diverso

quando le eseguo singolarmente funzionano senza problemi
se unisco i db 1 e 2, quelli che stanno sullo stesso server funziona
quando accodo anche il terzo ho questo errore:

Msg 245, Level 16, State 1, Line 2
Conversion failed when converting the nvarchar value 'Nome della ditta
DUE' to data type int.

(nota il DUE)


Google dice che "the common reason is that you are trying to convert,
either implicitly or explicitly, a varchar value to an int data type
and the varchar value cannot be converted to an int data type"


la prima domanda è: cosa significa Line 2 nel messaggio di errore?

nella query la riga 2 è vuota, è parte dei commenti iniziali che
spiegano la rava e la fava


se prendo la riga 2 del codice SQL vero è una semplice assegnazione di
testo a una variabile: 'Ditta1' as dbSAP

SELECT
'Ditta1' as dbSAP


i corrispondenti delle altre due qery variano solo per il nome usato:

SELECT
'Ditta2' as dbSAP

e

SELECT
'Ditta2' as dbSAP

A cosa si riferisce quindi quel Line 2 nel messaggio di errore?


Google aiuta un po':

Error number

A one-to-five-digit number that identifies the message. Error numbers
for user-defined messages can contain more digits.

Description

A Unicode string that contains information about the condition that
generated the message.

Severity level

A one- or two-digit number that indicates the severity of the error
condition.

State

A one- to three-digit number with a maximum value of 127 that indicates
to Microsoft support engineers and developers the location in the SQL
Server code that generated the message:

Line number

A number within the batch or stored procedure that contains the
statement that generated the message. Line number can also be within
the text of the stored procedure that is being executed.

ma non del tutto

o quasi, mi son fatto questa idea: dato che dopo SELECT (Line 1) vado a
capo a ogni campo, potrebbe anche essere che Line 2 si riferisce a uno
qualsiasi dei 40 campi che preparo, che MSSMS considera come una sola
riga, e che la risposta la potrei trovare togliendo uno alla volta i
campi dalle query, partendo dall'ultimo finché non trolo il bandolo
della matassa

a meno che abbiate un metodo diverso e più spiccio


Come scritto all'inizio, le query 2 e 3 sono state modificate partendo
da una copia della query 1; la 2 è praticamente identica, cambia giusto
il nome della Ditta (vedi sopra) e la formula di calcolo dell'importo;
la 3 ha qualche ritocco in più, necessario in quanto alcune
informazioni sono memorizzati in tabelle con nome diverso


ho generato i dati per la 1 e la 3, li ho messi in excel uno sopra
l'altro: a prima vista NON ci sono evidenti anomalie, tipo che nella 1
c'è una ABC e nella 3 c'è un 678
--
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\
-=- -=- -=- -=- -=- -=- -=- -=- - -=-
........... [ al lavoro ] ...........
Ammammata
2024-02-29 15:05:24 UTC
Permalink
mi son fatto questa idea: dato che dopo SELECT (Line 1) vado a capo a ogni
campo, potrebbe anche essere che Line 2 si riferisce a uno qualsiasi dei 40
campi che preparo, che MSSMS considera come una sola riga, e che la risposta
la potrei trovare togliendo uno alla volta i campi dalle query, partendo
dall'ultimo finché non trolo il bandolo della matassa
mi rispondo da solo per questo: è così, la Line 2 è tutto il pacchetto
dei 40 campi

ho anche fatto come dicevo, togliendone 5 alla volta per arrivare prima
al dunque, e ho trovato:

, Isnull(d.SlpCode, 0) AS Salesman

questo campo SlpCode è definito come type Int, size 11 per cui non mi
spiego perché l'assegnazione del valore 0 generi l'errore di cui
nell'OP

ho provato anche

, Isnull(d.SlpCode, cast(0 as int)) AS Salesman


poi, tuttaduntratto non il coro, ma l'errore:

nelle query 1 e 2 era rimasto il nome del campo vecchio, tipo char,
quasi uguale a quello nuovo usato nella query 3


BENE: che il post serva come spiegazione del valore Line nel messaggio
di errore, il resto è colpa mia e non merita di passare ai posteri :)
--
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\
-=- -=- -=- -=- -=- -=- -=- -=- - -=-
........... [ al lavoro ] ...........
Continua a leggere su narkive:
Loading...