giovedì 20 ottobre 2022

Per leggere il contenuto di un campo IMAGE di SqlServer è necessario, semplicemente convertire il campo in VARBINARY e poi in VARCHAR

la seguente query applicata alle fatturazione elettronica di Sigla, elenca tutte le fatture scartate e in due campi indica se lo scarto è relativo al formato (mancanza codice fiscale ) o al codice fiscale errato

WITH DATI AS (

 SELECT DATAFAT,NUMFAT,PIVA,

   CONVERT(VARCHAR(1000),CONVERT(VARBINARY(1000),R.FILEXML)) ERR

 FROM NOTEXML N INNER JOIN RIGHEXML R ON N.IDRIGA=R.IDRIGA

 INNER JOIN TESTAXML T ON N.IDTESTATA=T.IDTESTATA

 WHERE TIPONOTIF='Notifica di scarto'

   AND T.STATO='S' 

   AND SUBSTRING(T.STATOFAT,6,1)='2'

)

SELECT DATAFAT,NUMFAT,PIVA,

       CHARINDEX('00200',ERR) ERR200_FORMATO,

       CHARINDEX('00306',ERR) ERR306_CF,

       ERR

FROM DATI


 

lunedì 28 marzo 2022

Cancellazione (o Update) di record di una tabella in join con un'altra in MySql

DELETE T1 
FROM T1
        LEFT JOIN
    T2 ON T1.key = T2.key 
WHERE
    T2.key IS NULL


Una variante per l'update ha questa sintassi
UPDATE  T1 
        LEFT JOIN
    T2 ON T1.key = T2.key 
SET T1.campo=T2.campo
WHERE
    T2.key IS NULL

Questa variante permette di utilizzare la tabella T1 all'interno dell'eventuale subquery T2

esempio:
UPDATE T1 INNER JOIN
(SELECT CAMPO FROM T1 WHERE T1.CONDIZIONE ) T2 ON T1.KEY=T2.KEY
SET T1.CAMPO=T2.CAMPO
WHERE T1.CONDIZIONE

Thanks Elson Ferhati 

lunedì 21 marzo 2022

Allineamento fra valore Sequence e campo ID della tabella

Scenario :
  • Campo identity autoinc gestito con Trigger e Sequence 
  • Database Oracle versione inferiore alla 12 (perchè dalla 12 è gestito autonomamente come SqlServer)

Nei casi in cui in campo ID ( identificativo univoco ) venga inserito direttamente senza prelevare il campo dalla sequence o per qualche altro motivo ( nel mio caso ripristino delle tabelle e non delle sequence ), è necessario riportare il valore della sequence al massimo valore del campo autoinc +1.

La procedura sotto elencata fa questo lavoro.

DECLARE
  last_used  NUMBER;
  curr_seq   NUMBER;
BEGIN
  SELECT MAX(<CampoAutoInc>) INTO last_used FROM <Tabella>;
  LOOP
    SELECT <Sequence>.NEXTVAL INTO curr_seq FROM dual;
    IF curr_seq >= last_used THEN EXIT;
    END IF;
  END LOOP;
END;

Esempio

DECLARE
  last_used  NUMBER;
  curr_seq   NUMBER;
BEGIN
  SELECT MAX(IDN) INTO last_used FROM TESTAXML ;
  LOOP
    SELECT TESTAXML_SEQ.NEXTVAL INTO curr_seq FROM dual;
    IF curr_seq >= last_used THEN EXIT;
    END IF;
  END LOOP;
END;

lunedì 3 gennaio 2022

Sql Server Collation

Piccola riga sql per scoprire la collation dell'istanza Sql Server e di ogni Database


SELECT ' Istanza' name,CONVERT (varchar(256), SERVERPROPERTY('collation'))
union
Select name,collation_name from sys.databases
order by name  

sabato 1 gennaio 2022

Script per Zip, upload su WeTransfer, mail del log

Ho fatto questo script per automatizzare una serie di funzioni ma soprattutto perchè ho trovato il modo di spedire file a Wetransfer via linea di comando.
Lo script utilizza 3 programmi : 

lo script esegue le seguenti operazioni :
setta delle variabili per la posizione del file di log ( che verrà spedito per mail ), la cartella dove sono presenti i file di backup da spedire, la mail a cui spedire il log delle operazioni
comprime ( con 7Zip ) i file nella cartella di backup, uno per volta
sempre uno per volta li spedisce su wetransfer
spedisce il log delle operazioni alla mail indicata
nel log è indicato il link con cui scaricare i backup
 


set logfilename=c:\dati\log\backup-%date:~6,4%-%date:~3,2%-%date:~0,2%.txt
set backup_path=c:\dati\backup
set mail=a.delguasta+backup@gmail.com
echo "Inizio processo" > %logfilename% 
date /T >> %logfilename%
time /T >> %logfilename%
c:
cd \
cd "C:\Program Files\7-Zip"
echo "-- compressione --" > %logfilename% 
if exist %backup_path%\siglapp.7z del %backup_path%\siglapp.7z
7z.exe a %backup_path%\siglapp.7z %backup_path%\siglapp.bak >> %logfilename%
if exist %backup_path%\ditta1.7z del %backup_path%\ditta1.7z
7z.exe a %backup_path%\ditta1.7z %backup_path%\ditta1.bak >> %logfilename%
cd \dati\script
echo "-- upload --" >> %logfilename% 
wtclient-windows-386.exe upload --no-progress %backup_path%\siglapp.7z >> %logfilename%
wtclient-windows-386.exe upload --no-progress %backup_path%\ditta1.7z >> %logfilename%
echo "-- Invio Mail --" >> %logfilename% 
mailsend1.19.exe -to %mail% -from <from> -starttls -port 587 -auth -smtp smtp.gmail.com -sub test1 -user <from> -pass <password> -cs "utf-8" -mime-type "text/plain" -msg-body  %logfilename%


venerdì 9 luglio 2021

Ricerca Testo all'interno di viste e trigger

Per ricercare una porzione di testo all'interno della definizione di una vista o di un trigger è sufficiente interrogare la tabella sys.syscomments

SELECT * FROM sys.syscomments WHERE text LIKE '%<testo>%'

mercoledì 3 marzo 2021

Funzioni che restituiscono tabelle e join

 
Di seguito una funziona che accetta dei parametri e restituisce, in questo caso, un record di una tabella : 

CREATE FUNCTION dbo.VLISTDATA (@Codice CHAR(5), @Articolo CHAR(30), @Data CHAR(8) )
RETURNS TABLE
AS
RETURN
(
     SELECT * FROM TABRILIS
WHERE CODICE=@Codice
AND ARTICOLO=@Articolo
AND DATAINVALI = (
SELECT MAX(DATAINVALI) DATAINVALI FROM TABRILIS
WHERE CODICE=@Codice
AND ARTICOLO=@Articolo
AND DATAINVALI <= @Data
)
)

L'interessante è però come mettere in JOIN questa funzioni con altre tabelle.

Non è possibile utilizzare una normale JOIN ma è necessario utilizzare una CROSS APPLY come nell'esempio sotto: 

select M.ARTICOLO,M.EPRLORDO,PIPPO.PREZZO
from TESDOCUM T INNER JOIN MOVIMAG M ON T.NUMERO=M.NUMERO
INNER JOIN ANAMAGA A ON M.ARTICOLO=A.CODICE
INNER JOIN CLIFO ON T.CLI_FOR=CLIFO.CODICE
INNER JOIN CFVEN ON T.CLI_FOR=CFVEN.CODCF
Cross apply VLISTDATA(CFVEN.CODLIST,M.ARTICOLO,T.DATAPROTOC) PIPPO

Nell'esempio viene richiamata la funzione VLISTDATA per ogni riga del documento passandogli il codice listino del cliente, il codice articolo e la data del movimento.
La funzione restituisce tutti i campi della tabella TABRILIS con il record corrispondente alla data passata.

NB. L'esempio di cui sopra è solo accademia per Sigla ed è inutile in quanto tale dato si trova già nel campo EPRLISTINO di MOVIMAG

Testato sul Sql Server 2016

link : 
https://dba.stackexchange.com/questions/86143/how-to-join-a-table-with-a-table-valued-function
https://docs.microsoft.com/it-it/sql/t-sql/queries/from-transact-sql?view=sql-server-ver15