Sql Server 2005
Davide Mauri
Factory Software
davidem@factorysw.com
La Piattaforma Applicativa
Agenda
T-SQL
Ranking / Top n
CTE
Pivot / Unpivot
Try … Catch
Encryption
XML
2
Xml data type
XQuery
Full Text Search
Agenda
Integration Services
Data e Control Flow
Connections
Task
Transformations
Reporting Services
3
Report Manager
Sviluppo dei report con Visual Studio
Report Builder
T-SQL
4
FUNZIONI di RANKING
RANK
DENSE_RANK
NTILE
ROW_NUMBER
5
RANK
Ritona il “posizionamento” di ogni riga all’interno
di una partizione
PARTITION BY definisce il criterio di
partizionamento
ORDER BY stabilisce l’ordine in cui viene appicato
il rank alle righe
Sintassi:
SELECT
select_list,
RANK() OVER (PARTITION BY col1 ORDER BY col2)
as rank
FROM Tabella1
6
RANK
RANK = 1 + numero di rank che precedono la
riga
Se due o più righe sono alla pari, ricevono lo
stesso rank
I rank potrebbero non essere numeri consecutivi
7
DENSE_RANK
RANK = 1 + numero di DISTINCT rank che
precedono la riga
Se due o più righe sono alla pari, ricevono lo
stesso rank
Non vi sono “gap” nei rank
SELECT
select_list,
DENSE_RANK() OVER (PARTITION BY col1 ORDER
BY col2) as rank
FROM Tabella1
8
NTILE
Distribuisce le righe di una partizione ordinata in
uno specificato numero di gruppi
Se il numero di righe non è divisibile per il
numero di gruppi
I gruppi avranno ampiezza differente
Prima compariranno i gruppi con più elementi
SELECT
select_list,
NTILE(nr_gruppi) OVER (PARTITION BY col1 ORDER
BY col2) as rank
FROM Tabella1
9
ROW_NUMBER
Ritorna il numero sequenziale di una riga
all’interno di una partizione ordinata
SELECT
select_list,
ROW_NUMBER() OVER (PARTITION BY col1 ORDER
BY col2) as rank
FROM Tabella1
10
TOP
11
Specifica che solo la prima parte di un result set
verrà ritornata
PERCENT
WITH TIES (+ order by)
TOP @variabile
COMMON TABLE EXPRESSION (CTE)
12
Result set temporaneo
Non è salvato come oggetto
Rimane in vita solo per la durata della query che
lo ospita
Migliora la leggibilità e la manutenibilità delle
query
CTE: Utilizzo
Query ricorsive
13
Anchor Member e Recursive Member
Quert hint: option (maxrecursion n)
Sostituto delle view (quando non serve salvare i
metadati)
Referenziare lo stesso result set più volte nella
query
CTE: Sintassi
Struttura della CTE:
WITH nome_cte [(nome colonna,…)]
AS
(query che definisce la CTE)
Utilizzo:
SELECT * FROM
nome_cte
14
PIVOT
Ruota un’espressione tabellare trasformando i
valori univoci di una colonna nelle colonne
dell’espressione di output
Effettua le aggregazioni che costituiscono
l’output
SELECT VendorID, [164] AS Emp1, [198] AS Emp2, [223] AS
Emp3, [231] AS Emp4
FROM
( SELECT PurchaseOrderID, EmployeeID, VendorID
FROM Purchasing.PurchaseOrderHeader
)p
PIVOT(
COUNT (PurchaseOrderID)
FOR EmployeeID IN ( [164], [198], [223], [231] )) AS pvt
15
UNPIVOT
Effettua l’operazione inversa rispetto a PIVOT
Ruota le colonne in righe
I valori nulli non possono essere usati
SELECT VendorID, Employee, Orders
FROM
(SELECT VendorID, Emp1, Emp2, Emp3, Emp4
FROM pvt) p
UNPIVOT
(Orders FOR Employee IN
(Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt
GO
16
Error handling
Gestione simile al C# / VB.NET attraverso TRY e
CATCH:
Se si verifica un errore nel blocco TRY il controllo passa
al blocco CATCH.
Eseguito il blocco CATCH il controllo passa al codice
che sta dopo END CATCH
Blocco
TRY
Exception
Blocco
CATCH
Nessuna Exception
17
Codice
Successivo a
END CATCH
Sintassi di TRY...CATCH
18
Sintassi:
BEGIN TRY
...
END TRY
BEGIN CATCH
.... Gestione dell’errore .....
END CATCH
Il batch è unico!!!!
Try...catch TIPS
Ogni TRY..CATCH deve essere contenuto in un
unico BATCH, Stored Procedure, Trigger
I blocchi TRY…CATCH possono essere nidificati
Errori con severity <= 10 sono warning che non
vengono intercettati dal blocco CATCH
Errori con severity >= 20 che causano
l’interruzione della connessione:
19
Non sono gestiti da TRY…CATCH
Tuttavia finchè la connessione non è interrotta il
blocco CATCH funziona.
Try...catch e XACT_STATE
Nel blocco catch è bene controllare lo stato della
transazione attraverso XACT_STATE()
1: Transazione attiva, la sessione può compiere
qualsiasi azione (COMMIT o ROLLBACK)
0: Nessuna transazione attiva
-1: Esiste una transazione aperta, ma NON può essere
eseguito il COMMIT.
BEGIN CATCH
IF (XACT_STATE()) = -1
ROLLBACK TRANSACTION;
IF (XACT_STATE()) = 1
COMMIT TRANSACTION;
END CATCH
20
Informazioni sugli errori
ERROR_MESSAGE()
ERROR_NUMBER()
ERROR_SEVERITY()
ERROR_STATE()
ERROR_PROCEDURE()
ERROR_LINE()
Ritornano informazioni solo all’interno di un
blocco CATCH.
21
Posso utilizzate una stored procedure per il logging
TRY...CATCH: tips
Utilizzo di RAISERROR per il rethrow
Intercetta:
Non intercetta:
22
Deadlock errors
Errori di compilazione tipo syntax error
Statement level recompilation errors (object name
resolution errors)
ENCRYPTION
Possibilità di criptare i valori tramite l’utilizzo di
EncryptKey
DecryptKey
Utilizzabili negli statement DML
Solo chi è in possesso della chiave giusta potrà
vedere il valore
23
Gli altri vedranno NULL
XML
24
XML in un Database Relazionale?
E’ lo standard de facto
Dati trasmessi e ricevuti come XML
Sempre più utilizzato
I database prima o poi devono cominciare a fare i
conti con questa realtà
25
Utilizzato come Lingua Franca
Allora meglio farlo nel modo migliore
XML in un Database Relazionale?
XML può vivere all’interno del db in 3 modi
1. TEXT
26
Come accade con Sql Server 2000
Si perdono le funzionalità intrinsche di XML
XML in un Database Relazionale?
2. RELATIONAL FORMAT
27
Se possibile un documento può essere scomposto in
tabelle
Si sfruttano le capacità del motore relazionale
Si ottiene tramite OPENXML o XMLBULKLOAD
(SqlXml)
XML in un Database Relazionale?
3. XML Data Type
Utilizzo di tutte le funzionalità di xml
Supporto ricerche full-text
Supporto validazione
Utilizzabile in ogni situazione
Attenzione non abusarne
28
Colonne, Parametri, Variabili, Return Value
Violazione della forma normale
XML in un Database Relazionale?
Perchè dovrei?!?!
Memorizzazione di documenti XML
Memorizzazione di dati destrutturati
Sistemi Integrati
Messaging (SOAP)
Occhio a non sentirsi “obbligati”
29
B2B (Business To Business)/B2C (Business To Consumer)
A2A (Application To Application)
Ogni tanto la si cerca di usare solo perchè è nuova o
perchè non si conoscono alternative
XML in un Database Relazionale
Una colonna XML può memorizzare well-formed
XML
30
Fragments
Documents
XML in un Database Relazionale
Pieno supporto e gestione dell’encoding
-- This works correctly
INSERT INTO xml_tab VALUES(4,
'<?xml version="1.0" encoding="utf-8"?>
<doc1>
<row au_id="111-11-1111"/>
</doc1>')
-- This fails, encoding does not agree w/variable type
INSERT INTO xml_tab VALUES(5,
N'<?xml version="1.0" encoding="utf-8"?>
<doc1>
<row au_id="111-11-1111"></row>
</doc1>')
31
Typed & Untyped XML
E’ possibile fare in modo che il tipo XML sia
validato da un XML Schema
Per validare i dati inseriti
Per assicurarsi che tutte le entità abbiano la stessa
struttura
32
Definizione dei tipi di dati utilizzati
Constrained XML
E’ possibile anche utilizzare il vincolo CHECK
Constrained XML
CREATE TABLE docs
(
pk INT PRIMARY KEY,
xCol XML not null
CONSTRAINT CK_name CHECK
(xCol.exist('/book/author[first-name = lastname]') = 0)
)
33
XML Schema Collections
Gli XML Schema utilizzati devono essere nel
database
CREATE XML SCHEMA COLLECTION
34
Il nome verrà utilizzato nell’associazione con il tipo di
dato
Lo schema deve essere inserito come literal
XML Schema Collections
literal schema
targetNamespace
CREATE XML SCHEMA COLLECTION geocoll
'<xs:schema ...
targetNamespace= urn:geo>
...
</xs:schema>'
reference to
schema collection
Memorizzazione nella tabelle di sistema
35
CREATE TABLE Locations
(
location xml(geocoll)
...
)
sys.xml_schema_collections
sys.xml_schema_namespaces
XML Schema Sample
for namespace urn:geo
similar to sql type,
structured type,
i.e. a tree
element that might
appear in xml data
36
<xs:schema xmlns:xs=
"http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:geo"
xmlns:tns="urn:geo">
<xs:simpleType name="dim">
<xs:restriction base="xs:int"/>
</xs:simpleType>
<xs:complexType name="Point">
<xs:sequence>
<xs:element name="X"
type="tns:dim"/>
<xs:element name="Y"
type="tns:dim"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Point"
type="tns:Point"/>
</xs:schema>
Utilizzo di Typed XML
CREATE TABLE point_tab(
id int IDENTITY primary key,
-- geocoll include schema for 'urn:geo' namespace
thepoint xml(CONTENT, geocoll)
GO
-- this works, schema-valid Point
INSERT INTO point_tab VALUES(
'<Point xmlns="urn:geo"><X>10</X><Y>20</Y></Point>')
-- this insert fails, value foo is not a dim (integer)
INSERT INTO point_tab VALUES(
'<Point xmlns="urn:geo"><X>10</X><Y>foo</Y></Point>')
37
XML Schema Collections
L’ XML schema non è realmente memorizzato nel
database
Informazioni non memorizzate
38
Il contenuto è scomposto e memorizzato in tabelle di
sistema
Solo le imformazioni fondamentali vengono
memorizzate
Comments, Processing Instructions
<xs:annotation>
XML Schema Collections
Ottenere lo schema memorizzato
sys_schema_namespace(…, …)
select xml_schema_namespace(N’dbo’, N’geocollection’)
Non è lo schema orginale
39
Ma è Functionally Equivalent
FOR XML
Risultato memorizzabile in una varibile
Tramite la keywork TYPE
DECLARE @x xml
SET @x = SELECT * FROM authors
FOR XML AUTO, TYPE
Nuova keywork PATH per effettuare lo shaping
dell’XML
40
Più semplice da usare che EXPLICIT
FOR XML
SELECT
au_id as [@authorid],
au_fname as [name/firstname],
au_lname as [name/lastname]
FROM authors FOR XML PATH
<!– one row per selected row -->
<row authorid="111-11-1111">
<name>
<firstname>Bob</firstname>
<lastname>Smith</lastname>
</name>
</row>
...
41
XML BULK LOAD
42
I dati XML possono essere popolati tramite BULK
LOAD
XQuery
XQuery è l’evoluzione di XPath
Supporto di un subset di XQuery
implementazione basata con il draft Novembre 2003
http://www.w3.org/TR/xquery
Permette di poter fare query su dati
semistrutturati e/o destrutturati
43
Più correttamente è un SuperSet
XML
XQuery
XQuery fatta da “FLWOR” Expressions:
Può lavorare direttamente sull’ XML Data Type
44
FOR
LET (not supported)
WHERE
ORDER BY
RETURN
sia come variabile
sia come colonna
XQuery
Possibilità di utilizzare sia query XPath che
FLWOR
(: this is a valid XQuery :)
/people/person[age > 30]
(: so is this FLWOR expression :)
for $p in /people/person
where $p/age > 30
order by $p/age[1]
return $p/name
45
XQuery
-- returns <li>moe in record number x</li>
-- where x is the ID column, or blank column
SELECT xml_col.query('
for $b in //person
where $b/@name=“davide"
return <li>{ data($b/@name) } in record number
{sql:column("xml_tab.id")}</li>
')
FROM xml_tab
-- returns <li>moe is a stooge</li>
DECLARE @occupation VARCHAR(50)
SET @occupation = ' is a singer'
SELECT xml_col.query('
for $b in //person
where $b/@name=“eric"
return <li>{ data($b/@name) }
{sql:variable("@occupation") }</li>
')
FROM xml_tab
46
XQuery & Xml Data Type
Xml Data Type Functions
exist()
value()
query()
nodes()
modify()
SELECT
xmlCol.query(‘/Root/ProdDesc/*’)
FROM
myTable
47
xml.exist()
xml.exist usa XML type and XQuery expression
48
false se la query restituisce NULL
true negli altri casi
Può essere utilizzato in constraint di tipo CHECK
xml.exist()
-- pdoc must have a person element
-- as a child of the people root
CREATE TABLE xmltab(
id INTEGER PRIMARY KEY,
pdoc XML
CHECK (pdoc.exist('/people/person')=1)
)
-- ok
insert xmltab values(
1, '<people><person name="bob"/></people>')
-- fails, no persons
insert xmlpeople values(
2, '<people><emp name="fred"/></people>')
49
Supporto per DEFAULT
xml.value()
xml.value restituisce un tipo di dato nativo SQL
Server e scalar
Utilizzo
50
input: XQuery, SQL Type
restituisce un tipo scalare o NULL
non può restituire un tipo XML
predicati (es. WHERE Clause)
result values
views
xml.value()
-- insert some rows
INSERT xml_tab
VALUES('<people><person name=“alessandro"/></people>')
INSERT xml_tab
VALUES('<people><person name=“davide"/></people>')
INSERT xml_tab
VALUES('<people><person name=“franco"/></people>')
-- this query
SELECT id,
xml_col.value('/people/person/@name','varchar(50)') AS name
FROM xml_tab
-- yields this resultset
id
name
-------------------------1
alessandro
2
davide
3
franco
51
xml.query()
xml.query resituisce un XML data type
input: XQuery
l’xml risultante può essere un XML Fragment
può costruire nuovi elementi
<Invoice>
<LineItem>Soda</LineItem>
Colonna Invoice, Tabella Invoices
<LineItem>Ice</LineItem>
</Invoice>
SELECT invoice.query('Invoice/LineItem')
FROM Invoices
<LineItem>Soda</LineItem><LineItem>Ice</LineItem>
52
xml.nodes()
scompone il contenuto di un XML data type
simile (concettualmente) a value(), ma
il risultato può essere application al comando T-SQL
CROSS APPLY
53
produce dei nodi, non un valore scalare
il risultato è un rowset
si ottengono funzionalità simili ad OPENXML
performance migliori
xml.nodes()
--input xml in variable @x
<row id=“1”><name>alessandro</name><name>davide</name></row>
<row id=“2”><name>franco</name></row>
<row id=“3/>
-- this query
SELECT
...
FROM
@x.nodes(‘//row’) T(rows)
-- yields this resultset
id
name
-------------------------1
alessandro
1
davide
2
franco
54
Using Relational Data in XQuery
SQL Server XQuery può utilizzare sia dati XML
che dati relazionali
sql:variable: accesso a variabili T-SQL
sql:column: accesso a columns value
55
limitatamente alla riga in uso
Using Relational Data With XML
-- returns <li>moe in record number x</li>
-- where x is the ID column, or blank column
SELECT xml_col.query('
for $b in //person
where $b/@name=“Eric"
return <li>{ data($b/@name) } in record number
{sql:column("xml_tab.id")}</li>
')
FROM xml_tab
-- returns <li>moe is a stooge</li>
DECLARE @occupation VARCHAR(50)
SET @occupation = ' is a stooge'
SELECT xml_col.query('
for $b in //person
where $b/@name=“Bruce"
return <li>{ data($b/@name) }
{sql:variable("@occupation") }</li>
')
FROM xml_tab
56
XQuery DML
57
XQuery DML
xml.modify permette la modifica di XML
XQuery non ha standard DML
vengono utilizzati gli standard proposti
insert, delete, replace operators all’interno di espressioni
XQuery
insert
before or after element
first or last sibling
subelements and attributes
replace
58
must be a single node
elements or attributes
solo simple types
“value-of" clause per aggiornare i valori
XQuery DML - Original Document
declare @x xml
set @x =
'<Invoice>
<InvoiceID>1000</InvoiceID>
<CustomerName>Jane Smith</CustomerName>
<LineItems>
<LineItem>
<Sku>134</Sku>
<Quantity>10</Quantity>
<Description>Chicken Patties</Description>
<UnitPrice>9.95</UnitPrice>
</LineItem>
<LineItem>
<Sku>153</Sku>
<Quantity>5</Quantity>
<Description>Vanilla Ice Cream</Description>
<UnitPrice>1.50</UnitPrice>
</LineItem>
</LineItems>
</Invoice>'
59
XQuery DML - Using xml.modify
-- use modify to insert a subelement
SET @x.modify(
'insert <InvoiceDate>2002-06-15</InvoiceDate>
into /Invoice[1] ')
-- or insert an attribute
SET @x.modify('insert attribute status{"backorder"}
into /Invoice[1] ')
-- this deletes all LineItem elements
SET @x.modify('delete /Invoice/LineItems/LineItem')
-- change the value of the CustomerName element
SET @x.modify('replace value of
/Invoice[1]/CustomerName[1]/text()[1]
with "John Smith" ')
60
XML Full Text Search
XML filter
Index e query su istanze XML
Analisi sul contenuto di un token
I tag (attributi inclusi) sono rimossi
Sintassi — come per le altre colonne
CREATE FULLTEXT INDEX ON docs (xDoc)
61
XML Full Text Search
Può essere combinata con XQuery
Full-text search come filtro, poi XQuery search
SELECT R.X.query ('//sec[@num=12]')
FROM
(SELECT * FROM docs
WHERE contains (xDoc, 'Wrd1 Wrd2')) R(X)
Supporta l’attributo xml:lang
Utilizza correttamente il linguaggio
SELECT * FROM docs
WHERE contains (xDoc, 'Visionen',
LANGUAGE 'German')
62
Integration Services
63
Architettura ed Object Model
Separazione dei package in due aree
Modello ad oggetti facilmente estendibile basato
sul .NET Framework
64
Control Flow
Data Flow
Non limitato ai soli Custom Task
Architettura ed Object Model
Supporto per sorgenti e destinazioni multiple
Supporto nativo XML, SQL CE 2005, AS 2005
come sorgenti/destinazione dati
Introduzione delle DTS Expression
65
Una sorta di linguaggio interno
Vagamente simile a C#
Ambiente di sviluppo
BI Development Studio
Praticamente è Visual Studio
Designer molto più ordinato tramite l’utilizzo di
aree “tematiche”
Supporto per sistemi di gestione del codice
66
Visual SourceSafe
Migliorate le capacità di debugging
Package Elements
Numerosi nuovi task
Data Flow
Data Preparation
Workflow
Sql Server
Scripting
Analisys Server
Maintenance
Aggiunto il supporto per i Containers
67
Loop, For Each, Sequence, ecc…
Tools
Wizard per:
DTExecUI e DTExec
Esecuzione dal prompt
DTUtil
68
Configurazione dei Package
Deployment e Update
Migrazione dai DTS di SQL Server 2000
Gestione dal prompt (copy, crypt, sign…)
Package Management
E’ possibile utilizzare dei Folder per fare ordine
Logging non limitato alle trasformazioni
69
Supporto nativo per la configurazione del
package senza necessità di utilizzo dell’ambiente
di editing
Package Checkpointing
Sviluppo
Molti elementi permettono l’utilizzo di un
“Linguaggio” interno: DTS Expressions
Possibilità di creare workflow molto complessi
Possibilità di gestire gli eventi (es. OnError)
Programmabili ed estendibili con .NET
70
Packages
71
Package Content
Un Package può contenere:
Control Flow
Data Flow
72
Task
Container
Trasformations
Connections
Configurations
Variables
Operational Surfaces
73
Control Flow
Data Flow
Event Handlers
Package Explorer
Execution Results
Connection Managers
Properties
Control Flow
Descrive l’intero processo definito dal Package
Organizza i task e specifica percorsi e/o
precedenze
Il workflow è basato sul risultato di
un’espressione DTS
74
Praticamente nessun limite alla fantasia!
Data Flow
Source
Transform
Destination
Descrive il flusso dei dati (Pipeline)
Specifica dettagliatamente tutto ciò che riguarda
la manipolazione dei dati
E’ un task del Control Flow
75
Connection Managers
Le connessioni visualizzate in uno spazio
dedicato
Non solamente dedicate ai database
76
Es. SMTP Connection Manager, FTP Connection
Manager
Condivise sia dagli elementi del Control Flow che
del Data Flow
Control Flow Elements
Tre diversi tipi di Container:
Possibilità di effettuare dei loop:
Raggruppamento di task
77
For Loop
ForEach Loop
Sequence
Control Flow Elements
Numerosi nuovi task che evitano la scrittura di
codice
Data Flow Task
File System Task
78
Per la definizione dettagliata dei processi di ETL
Per la gestione dei file e delle directory (Create, Copy,
Move, Delete, Rename, Set Attributes)
Control Flow Elements
Script Task
Send Mail Task
Supporto SMTP (Era Ora! )
FTP Task
79
Esecuzione di script scritti in VB.NET
Editor *finalmente* evoluto
Supporto per tutte le operazione non solo il GET
Control Flow Elements
WMI Data Reader Task
WMI Event Watcher Task
Per monitorare i dati di WMI e rispondere ai
cambiamenti
XML Task
80
Per ottenere informazioni da WMI
Per operare su documenti XML (XSLT, Merge, Patch,
Diff, Validate, XPath)
Data Flow Elements
Conditional Split Transform
Multicast Transform
Permette di processare una riga più volte e con diversi
meccanismi
Union All Transform
81
Per processare una riga secondo diversi criteri
Prende più input e di generare un solo output
Data Flow Elements
Sort Transformation
Count Rows Transformation
Per contare le righe
Derived Column
82
Per ordinare le righe
Per modificare o creare colonne
Data Flow Elements
Fuzzy Grouping
Fuzzy Lookup
Pulisce ulteriormente i dati (Es. Standardizzazione,
Correzione ed inserimento valori mancanti)
Percentage Sampling
83
Pulisce e standardizza i dati (Es. Rimuove i duplicati)
Crea dati di prova
Data Viewers
Attivi durante il debug
Permettono di interrompere l’esecuzione di un
Data Flow visualizzare i dati
E’ possibile vedere anche la distribuzione dei dati
con l’ausilio di grafici
84
Reporting Services
85
Reporting Services
Editor Report: BI Dev. Studio
Non è obbligatorio in quanto il report è un file xml
Però è praticamente indispensabile
Creare un progetto di tipo “Report Project”
Aggiungere:
86
Data Sources
Parametri
Reports
Reporting Services
Ogni proprietà visibile (e non) può essere
modificata tramite l’uso di expressions
Il linguaggio è VB.NET
In più ci sono funzioni aggiunte dall’infrastruttura
di SSRS
87
Previous
RowNumber
CountRows
Sviluppo
E’ possibile aggiungere funzioni tramite
Per personalizzare il report è possibile utilizzare
immagini
88
Codice Embedded (VB.NET)
External Assembly (Qualsiasi linguaggio .NET)
Memorizzate nel report (embedded)
Esterne (link)
Memorizzata in un db
Reporting Services
Il Report Manager è “solamente” l’applicazione di
default fornita da Microsoft
Utilizza il web service per visualizzare i metadati e
gestire i report
I report vengono visualizzati in un IFRAME
89
E sono chiamati tramite URL
Reporting Services
E’ possibile integrare SSRS in qualsiasi
applicazione tramite
E’ possibile integrare il tutto con SharePoint
90
Chiamate SOAP (Web Services)
Chiamate via URL
Web part disponibile dalla SP2 dei “vecchi” RS
Reporting Services
Creazione di report ad-hoc
Non c’è un liberta “totale”
91
Tramite il Report Builder
I report possono essere creati sulla base di un “Report
Model”
Il “Report Model” contiene i metadati disponibili
Più che sufficiente nel 99% dei casi
Il “Report Model” si crea da Visual Studio
Reporting Services
92
Invocazione di Report
E’ possibile accedere a Reporting Services in una
soluzione custom in due modalita’:
Url access
Web Services
93
richiesta via HTTP/GET
Richiesta via SOAP
Invocazione di Report
94
Invocazione di Report
Url Access
Report Server URL
Report Name
Nome del report
Report Parameters
95
Defaults to http://[servername]/ReportServer
I nomi devono mappare I parametri definiti nel report
Es http://servername/ReportServer/ReportName?
CategoryID=1&EmployeeID=1
Invocazione di Report
Web Services
Esecuzione dei report
Gestione report
96
GetReportParameters()
Render()
Anche asincrona
CreateReport()
GetReportDefinition()
Distribuzione dei report
I report possono essere visualizzati
…ma possono anche essere loro ad andare
dall’interessato
97
Da web, tramite il Report Manager
Da applicazioni ad hoc, o integrati in applicazioni
esistenti
Via mail
Via network share
Questa funzionalità prendere il nome di
Subscription
Distribuzione dei report
Le subscription vengono eseguite in base ad una
schedulazione
La schedulazione fa affidamento sul SQL Server
Agent
98
Ad hoc
Condivisa
Quindi deve essere attivo!
Vengono creati dei Job ad hoc
Distribuzione dei report
99
Distribuzione tramite network share
Distribuzione dei report
100
Distribuzione via email
Distribuzione dei report
Le sottoscrizioni guidate (Data-Driven
subscription) permettono di impostare a runtime
I dati vengono prelevati tramite query ad hoc
101
Destinatari
Parametri
Formati
La sorgente dati, come al solito, può essere qualsiasi
cosa (SQL Server, Oracle, OLEDB, ODBC)
Domande ?
102
© 2004 Microsoft Corporation. All rights reserved.
This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.