Visualizzazione post con etichetta Sql Server. Mostra tutti i post
Visualizzazione post con etichetta Sql Server. Mostra tutti i post

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ì 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  

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

giovedì 25 luglio 2019

Dimensione tabelle in Sql Server

Ci sono diversi modi per conoscere l'effettiva dimensione in Kb/Mb di una tabella

Usando Sql Server Management Studio è possibile cliccare con il tasto destro sul database, scegliere dal menu la voce Report, quindi la voce "Report Standard" e infine la voce "Spazio su disco utilizzato per tabella".


Sempre con Sql Server Management Studio, selezionare prima la voce "Tabelle" nell'elenco di sinistra. Nella finestra "Dettagli esplora oggetti", una volta visualizzate tutte le tabelle è possibile indicare quali colonne vogliamo visualizzare. Fra le colonne che per default sono deselezionate ci sono : "Spazio utilizzato per i dati (KB)" e "Spazio utilizzato per gli indici (KB)"


L'ultimo modo per determinare lo spazio utilizzato dalle tabelle e degli indici di un database è quello di eseguire la seguente query (thanks Gianni GC Ceccanti 19/03/2021): 

select cast(Tabella as char(50)) as "Tabella", 
       max(Record) as "N. Record",  --max perché in base agli inidici cambia, il max corrisponde al totale sulla tabella
       sum(AllocatoTabellaMB) + sum(AllocatoIndiceMB) as "Totale Allocato (MB)", -- allocato su disco
       sum(AllocatoTabellaMB) as "Allocato Tabella (MB)", -- allocato su disco
       sum(AllocatoIndiceMB) as "Allocato Indice (MB)", -- allocato su disco
       sum(InutilizzatoMB) as "Inutilizzato (MB)" -- differenza tra spazio allocato e spazio utilizzato, quindi disponibile prima che SQLServera allochi nuovo spazio
  FROM (
      SELECT t.name AS "Tabella",
            p.rows as "Record",
            isnull( i.name , '_tabella_' ) as Tipo,
            (case when i.name is null then  CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) else 0 end) AS AllocatoTabellaMB,
            (case when i.name is not null then  CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) else 0 end) AS AllocatoIndiceMB,
            CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS InutilizzatoMB
       FROM sys.tables t
            INNER JOIN sys.indexes i ON t. object_id = i.object_id
            INNER JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
            INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id
            LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id
      WHERE t.name NOT LIKE 'dt%' 
         AND t.is_ms_shipped = 0
         AND i.OBJECT_ID > 255 
      GROUP BY  t.name, s.name, p.rows, i.name
      ) as innertable
GROUP BY Tabella
ORDER BY sum(AllocatoTabellaMB) + sum(AllocatoIndiceMB) DESC, Tabella
La query precedente, qui sotto, non teneva conto degli indici:
SELECT 
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB, 
    CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
    SUM(a.used_pages) * 8 AS UsedSpaceKB, 
    CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
    CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
WHERE 
    t.NAME NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    t.Name
Riferimenti : 
https://stackoverflow.com/questions/7892334/get-size-of-all-tables-in-database

lunedì 5 febbraio 2018

SQL Server Migration Assistant (SSMA)

SQL Server migration assistant (SSMA) è un tool Microsoft che facilità la migrazione da altri RDBMS verso Sql Server.

SSMA è disponibile per la migrazione dai seguenti RDBMS:
  • Access
  • Db2
  • MySql
  • Oracle
  • SAP ASE

La versione di Sql Server di destinazione dovrà essere una delle seguenti:
  • SQL Server 2008
  • SQL Server 2008 R2
  • SQL Server 2012
  • SQL Server 2014
  • SQL Server 2016
  • Azure SQL Database
  • SQL Server 2017 on Windows and Linux (Preview)


Il tool premette la migrazione di dati, schema, struttura tabelle, viste, indici e trigger.

Il tool permette di sincronizzare i due database per quanto riguarda gli oggetti presenti. Il mio utilizzo è stato solo quello di migrazione delle strutture delle tabelle, indici e dei dati.

Ho usato il tool per trasferire dai dati da Oracle 10 a Sql Server 2012 Express.
Inizialmente è necessario collegarsi al server Oracle e a quello SQL Server.

Per quanto riguarda Oracle è sufficiente indicare il server e le credenziali.
 Per quanto riguarda Sql Server, oltre a server e credenziali è necessario indicare anche il database di destinazione.



Nella finestra principale il tool visualizza tutti gli schema dell’istanza Oracle.


Per quanto riguarda le strutture dati è necessario eseguire i seguenti passi :
  •          Scegliere lo/gli schema Oracle da migrare
  •          Scegliere la funzione “Convert Schema” dal menu contestuale
  •          Scegliere il database Sql Server di destinazione
  •          Scegliere la funzione “Synchronize with database” dal menu contestuale


Per quanto riguarda i dati è necessario eseguire i seguenti passi :
  •         Scegliere lo/gli schema Oracle da migrare
  •         Scegliere la funzione “Migrate Data” dal menu contestuale


L’utilizzo normale del tool prevede che dato un database di Oracle, tutti i suoi schema vengano passato su un singolo database di Sql Server. Per questo motivo le tabelle di destinazione utilizzano lo stesso schema delle tabelle di origine.

Per cambiare il mapping dello schema è sufficiente selezionare lo schema di origine e cambiare il “target schema” nello “schema mapping” sulla destra dello schermo.
Quindi da database.schema a database.dbo

Nel caso si voglia trasferire ogni schema di Oracle su un database diverso di Sql Server è necessario creare un nuovo progetto di SSMA per ogni schema.

La pagina web di riferimento del tool :