Discussione:
CREATE VIEW DA STORED PROCEDURE - INCORRECT SYNTAX NEAR THE KEYWORD 'VIEW'
(troppo vecchio per rispondere)
Maurizio
2008-05-16 13:52:26 UTC
Permalink
Salve a tutti,
devo creare una view all'interno di una stored procedure sul modello di
quella che segue:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[PROVA]
AS
BEGIN
CREATE VIEW dbo.VISTAX AS SELECT * FROM dbo.Anagrafiche
END

In risposta al controllo di sintassi ottengo il seguente errore:

Msg 156, Level 15, State 1, Procedure PROVAX, Line 4
Incorrect syntax near the keyword 'VIEW'.


Ho girato per mezza internet ed ho trovato soltanto un workaround che
consiste nella sostituzione del CREATE VIEW con l'Exec come segue:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[PROVA]
AS
BEGIN
exec('CREATE VIEW dbo.VISTAX AS SELECT * FROM dbo.Anagrafiche')
END

in questo caso funziona.

Il problema è che la view effettiva che dovrei creare è di oltre 8000
caratteri e non posso utilizzare il trucco perchè la lunghezza max della
stringa passata all'exec non può superare questo limite, senza considerare
che dovrei rivedere completamente la query per quanto riguarda la gestione
della moltitudine di apici che contiene al suo interno.

La domanda è semplice: L'ERRORE CHE OTTENGO E' UN BUG di SQL SERVER? Se no
come si può risolvere?

Girando sul supporto tecnico Microsoft tra l'altro ho visto che il problema
si presentava anche con SQL Server 2000, ma in quel caso consigliavano di
scaricare l'MDAC 2.6 SP2, mentre da quello che mi risulta XP SP2 installa
MDAC 2.8 SP1 quindi più aggiornato.
Il mio SQL Server è la versione 2005 con compatibility level=9.0 su XP SP2

Qualche soluzione?

Grazie e ciao
Maurizio
Lorenzo Benaglia
2008-05-16 14:04:46 UTC
Permalink
Post by Maurizio
devo creare una view all'interno di una stored procedure sul modello
Ciao Maurizio,

Da dove deriva una esigenza così singolare? :-)
Post by Maurizio
Il problema è che la view effettiva che dovrei creare è di oltre 8000
caratteri e non posso utilizzare il trucco perchè la lunghezza max
della stringa passata all'exec non può superare questo limite, senza
considerare che dovrei rivedere completamente la query per quanto
riguarda la gestione della moltitudine di apici che contiene al suo
interno.
La domanda è semplice: L'ERRORE CHE OTTENGO E' UN BUG di SQL SERVER?
No.
Post by Maurizio
Se no come si può risolvere?
I Books Online nel paragrafo "EXECUTE (Transact-SQL)" riportano:

"@ string_variable
Is the name of a local variable. @string_variable can be any char, varchar,
nchar, or nvarchar data type. These include the (max) data types".

Hai provato a dichiarare una variabile locale di tipo varchar(max) che
contenga il comando "CREATE VIEW..." e che andrai ad eseguire via EXEC
@Variabile?

Ad ogni modo non capisco l'esigenza, le viste e tutti gli altri oggetti
dovrebbero essere creati dal DBA/DB Dev, non certo applicativamente da una
sp...
Post by Maurizio
Grazie e ciao
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Maurizio
2008-05-16 14:19:31 UTC
Permalink
L'esigenza deriva dal fatto che la vista è molto complessa e delicata per i
dati che produce e purtroppo l'editor delle viste semplicemente ammucchia
tutto il testo della query senza tener conto dell'indentazione, rendendo
ogni modifica veramente difficoltosa e soggetta ad errori.
L'editor delle stored invece mantiene l'indentazione e anche i colori
rendendo molto agevole e sicura la variazione della quey.
L'idea è di creare un repository delle definizioni di tali viste
modificandole e rigenerandole direttamente tramite la stored che comunque
sono gestite dal DBA/DBA Dev non da applicativo.
p.s.
Il varchar ha una lunghezza max di 8000 caratteri e nel mio caso non lo
posso utilizzare con l'exec perchè le query vanno oltre gli 8000.
Tra l'altro se nella query hai dei valori costanti tra apici (ad esempio
come risultato di CASE) perdi in compattezza perchè sei costretto a
preoccuparti anche della formattazione del testo. (gli apici devono essere
raddoppiati).

Ciao
Maurizio
Post by Lorenzo Benaglia
Post by Maurizio
devo creare una view all'interno di una stored procedure sul modello
Ciao Maurizio,
Da dove deriva una esigenza così singolare? :-)
Post by Maurizio
Il problema è che la view effettiva che dovrei creare è di oltre 8000
caratteri e non posso utilizzare il trucco perchè la lunghezza max
della stringa passata all'exec non può superare questo limite, senza
considerare che dovrei rivedere completamente la query per quanto
riguarda la gestione della moltitudine di apici che contiene al suo
interno.
La domanda è semplice: L'ERRORE CHE OTTENGO E' UN BUG di SQL SERVER?
No.
Post by Maurizio
Se no come si può risolvere?
varchar, nchar, or nvarchar data type. These include the (max) data
types".
Hai provato a dichiarare una variabile locale di tipo varchar(max) che
contenga il comando "CREATE VIEW..." e che andrai ad eseguire via EXEC
@Variabile?
Ad ogni modo non capisco l'esigenza, le viste e tutti gli altri oggetti
dovrebbero essere creati dal DBA/DB Dev, non certo applicativamente da una
sp...
Post by Maurizio
Grazie e ciao
Prego.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Lorenzo Benaglia
2008-05-16 14:42:35 UTC
Permalink
Post by Maurizio
L'esigenza deriva dal fatto che la vista è molto complessa e delicata
per i dati che produce e purtroppo l'editor delle viste semplicemente
ammucchia tutto il testo della query senza tener conto
dell'indentazione, rendendo ogni modifica veramente difficoltosa e
soggetta ad errori. L'editor delle stored invece mantiene l'indentazione e
anche i colori
rendendo molto agevole e sicura la variazione della quey.
L'idea è di creare un repository delle definizioni di tali viste
modificandole e rigenerandole direttamente tramite la stored che
comunque sono gestite dal DBA/DBA Dev non da applicativo.
Ciao Maurizio,

Non capisco, non puoi semplicemente salvare il comando DDL della vista
sottoforma di file .sql e se è il caso, archiviarlo con un sw di Version
Control System (tipo CVS, Source Safe, ecc...)?
Post by Maurizio
Il varchar ha una lunghezza max di 8000 caratteri e nel mio caso non
lo posso utilizzare con l'exec perchè le query vanno oltre gli 8000.
No, il varchar(max) arriva fino a 2^31-1 bytes.
Post by Maurizio
Tra l'altro se nella query hai dei valori costanti tra apici (ad
esempio come risultato di CASE) perdi in compattezza perchè sei
costretto a preoccuparti anche della formattazione del testo. (gli
apici devono essere raddoppiati).
Salvando i comandi DDL questo problema non ce l'hai.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Maurizio
2008-05-16 14:54:50 UTC
Permalink
Indipendentemente dalle possibili soluzioni il problema è quello che ti
dicevo prima, cioè perchè dall'interno di una stored posso creare di tutto
(CREATE TABLE, CREATE USER, CREATE SCHEMA, CREATE TRIGGER ecc) mentre non
sono in grado di scrivere una cosa semplice come CREATE VIEW.
Il CREATE VIEW è uno statement di Transact-SQL, documentato nei books
online, mi aspetterei che funzionasse ne piu ne meno come tutti gli altri.
Se possibile vorrei sapere come risolvere l'anomalia che ho riscontrato a
prescindere da eventuali soluzioni.

Grazie per ogni aiuto
Maurizio
Post by Lorenzo Benaglia
Post by Maurizio
L'esigenza deriva dal fatto che la vista è molto complessa e delicata
per i dati che produce e purtroppo l'editor delle viste semplicemente
ammucchia tutto il testo della query senza tener conto
dell'indentazione, rendendo ogni modifica veramente difficoltosa e
soggetta ad errori. L'editor delle stored invece mantiene l'indentazione
e anche i colori
rendendo molto agevole e sicura la variazione della quey.
L'idea è di creare un repository delle definizioni di tali viste
modificandole e rigenerandole direttamente tramite la stored che
comunque sono gestite dal DBA/DBA Dev non da applicativo.
Ciao Maurizio,
Non capisco, non puoi semplicemente salvare il comando DDL della vista
sottoforma di file .sql e se è il caso, archiviarlo con un sw di Version
Control System (tipo CVS, Source Safe, ecc...)?
Post by Maurizio
Il varchar ha una lunghezza max di 8000 caratteri e nel mio caso non
lo posso utilizzare con l'exec perchè le query vanno oltre gli 8000.
No, il varchar(max) arriva fino a 2^31-1 bytes.
Post by Maurizio
Tra l'altro se nella query hai dei valori costanti tra apici (ad
esempio come risultato di CASE) perdi in compattezza perchè sei
costretto a preoccuparti anche della formattazione del testo. (gli
apici devono essere raddoppiati).
Salvando i comandi DDL questo problema non ce l'hai.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Lorenzo Benaglia
2008-05-16 14:59:47 UTC
Permalink
Post by Maurizio
Il CREATE VIEW è uno statement di Transact-SQL, documentato nei books
online, mi aspetterei che funzionasse ne piu ne meno come tutti gli
altri. Se possibile vorrei sapere come risolvere l'anomalia che ho
riscontrato a prescindere da eventuali soluzioni.
Ciao Maurizio,

te l'ho spiegato, dichiara una variabile locale varchar(max), valorizzala
con la stringa che costituisce il comando DDL 'CREATE VIEW...' ed eseguila
Post by Maurizio
Grazie per ogni aiuto
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
AlessandroD
2008-05-16 15:09:50 UTC
Permalink
Post by Maurizio
Il CREATE VIEW è uno statement di Transact-SQL, documentato nei books
online, mi aspetterei che funzionasse ne piu ne meno come tutti gli altri.
Veramente nel BOL:

[CREATE VIEW]
http://msdn.microsoft.com/it-it/library/ms187956.aspx

C'è scritto:
"
Deve essere la prima istruzione di un batch di query.
"

Quindi c'è poco da parlare di bachi, funziona così ed è pure documentato.
Tornando a bomba, non capisco che problema hai dell'avere delle viste che
non perdono l'identazione del sorgente, se per crearle ed aggiornarle invece
di usare il wizard a mo di query editor, ti affidi ad una nuova finestra
dove chiedi il modify di una vista già esistente oppure a mano la crei via
T-SQL, vedrai che non perderai proprio nulla in termini di identazione.
Post by Maurizio
Se possibile vorrei sapere come risolvere l'anomalia che ho riscontrato a
prescindere da eventuali soluzioni.
Non è un'anomalia.
--
Ciao, Alessandro
/*
Alessandro Dereani - MVP SQL Server - http://mvp.support.microsoft.com
*/
Maurizio
2008-05-16 16:23:43 UTC
Permalink
Post by AlessandroD
"
Deve essere la prima istruzione di un batch di query.
Nell'esempio che ho riportato e che riporto di seguito cè solo il create
view, non ci sono istruzioni prima ne dopo a meno che le righe relative alla
definizione stessa della stored non siano considerate istruzioni.
ALTER PROCEDURE [dbo].[PROVA]
AS
BEGIN
CREATE VIEW dbo.VISTAX AS SELECT * FROM dbo.Anagrafiche
END

Msg 156, Level 15, State 1, Procedure PROVA, Line 3
Incorrect syntax near the keyword 'VIEW'

In altri termini vorrei riuscire ad usare l'istruzione CREATE VIEW
all'interno di una stored procedure considerando che non posso usare
exec(@query) perchè la mia query sfora gli 8000 caratteri.

Puoi farmi un esempio funzionante? Io non ci sono riuscito.

Per quanto riguarda la creazione e la modifiche delle viste non uso wizard,
uso i comandi "New view" e "Modify" direttamente sulla vista. Aprendo query
molto estese potrai notare che all'atto dell'apertura della query il testo
viene compattato (tipico esempio i CASE WHEN che sono messi uno dietro
l'altro perdendo ogni forma di indentazione).

Indentazione a parte il problema vero riguarda solo ed esclusivamente
l'utilizzo del comando CREATE VIEW all'interno di una stored senza usare il
comando exec. Da quello che fin qui ho visto sembra che non sia possibile.

Grazie
Ciao
Post by AlessandroD
Post by Maurizio
Il CREATE VIEW è uno statement di Transact-SQL, documentato nei books
online, mi aspetterei che funzionasse ne piu ne meno come tutti gli altri.
[CREATE VIEW]
http://msdn.microsoft.com/it-it/library/ms187956.aspx
"
Deve essere la prima istruzione di un batch di query.
"
Quindi c'è poco da parlare di bachi, funziona così ed è pure documentato.
Tornando a bomba, non capisco che problema hai dell'avere delle viste che
non perdono l'identazione del sorgente, se per crearle ed aggiornarle
invece di usare il wizard a mo di query editor, ti affidi ad una nuova
finestra dove chiedi il modify di una vista già esistente oppure a mano la
crei via T-SQL, vedrai che non perderai proprio nulla in termini di
identazione.
Post by Maurizio
Se possibile vorrei sapere come risolvere l'anomalia che ho riscontrato a
prescindere da eventuali soluzioni.
Non è un'anomalia.
--
Ciao, Alessandro
/*
Alessandro Dereani - MVP SQL Server - http://mvp.support.microsoft.com
*/
AlessandroD
2008-05-16 16:59:05 UTC
Permalink
Post by Maurizio
Nell'esempio che ho riportato e che riporto di seguito cè solo il create
view, non ci sono istruzioni prima ne dopo a meno che le righe relative
alla definizione stessa della stored non siano considerate istruzioni.
La definizione della stored procedure è a tutti gli effetti un batch, dove
appunto il primo comando è il CREATE/ALTER della stored procedure, di
conseguenza non può esserci in qualunque altro punto anche uno create view.
Passando attraverso l'uso di exec(@stringa) ne esci perché @stringa è solo
il parametro relativo al comando exec, parametro il cui contenuto non
c'entra nulla, semanticamente parlando, con il batch corrente.
Che poi in fase di esecuzione la chiamata ad exec produca l'esecuzione di un
altro batch il cui corpo è dato dalla definizione della vista è un altro
discorso, che fra l'altro ti permette appunto di ottenere quello che vuoi,
anche se io ancora non ne capisco il motivo.
Post by Maurizio
In altri termini vorrei riuscire ad usare l'istruzione CREATE VIEW
all'interno di una stored procedure considerando che non posso usare
Puoi farmi un esempio funzionante? Io non ci sono riuscito.
Come ti ha già indicato Lorenzo puoi usare un parametro di ingresso di tipo
varchar(max):

CREATE PROCEDURE [dbo].[PROVA]
@sql varchar(max)
AS
exec (@sql)
return
go

exec dbo.PROVA 'CREATE VIEW dbo.VISTAX AS SELECT * FROM dbo.Anagrafiche'

Poi lato client quando chiami la sp puoi valorizzare il parametro @sql con
una bella stringa lunga fino a 4GB...
Post by Maurizio
Per quanto riguarda la creazione e la modifiche delle viste non uso
wizard, uso i comandi "New view" e "Modify" direttamente sulla vista.
Aprendo query molto estese potrai notare che all'atto dell'apertura della
query il testo viene compattato (tipico esempio i CASE WHEN che sono messi
uno dietro l'altro perdendo ogni forma di indentazione).
Mai successo, ne quando usavo il Query Analyzer di SQL 2000, ne ora con SSMS
di SQL 2005.
Certo è che non ho mai avuto viste tanto grosse da superare gli 8kb di
sorgente, quindi non so se esistono bachi dell'editor in questo senso.
Post by Maurizio
Indentazione a parte il problema vero riguarda solo ed esclusivamente
l'utilizzo del comando CREATE VIEW all'interno di una stored senza usare
il comando exec. Da quello che fin qui ho visto sembra che non sia
possibile.
Inutile che insisti, stai cercando di fare una cosa che è documentata come
non fattibile... :-)
In ogni caso anche se vuoi insistere con la creazione di viste passando per
una stored procedure che accetta un parametro varchar(max), e tenerti da
qualche parte i sorgenti delle viste, non hai nessun problema di
duplicazione di apici vari, visto che in ogni caso l'unica cosa che devi
fare è leggere il sorgente e richiamare la sp passando nel suo parametro
proprio l'intero sorgente.
Se la chiamata della sp la fai in modo corretto, quindi senza produrre a tua
volta un'altra sringa sql con dentro la chiamata alla sp e nidificato
all'interno della stringa anche tutto il sorgente della vista, ma passando
attraverso ADO o ADO.NET e facendo uso degli oggetti
command e parameter, vedrai che non avrai problemi (per essere più chiari
ancora, lato client non devi produrre una stringa di questo tipo:
"exec dbo.PROVA 'CREATE VIEW dbo.VISTAX AS SELECT * FROM dbo.Anagrafiche'"
e poi cercare di eseguirla in qualche modo dopo aver stabilito una
connessione verso SQL Server).
--
Ciao, Alessandro
/*
Alessandro Dereani - MVP SQL Server - http://mvp.support.microsoft.com
*/
Maurizio
2008-05-16 19:25:32 UTC
Permalink
Post by AlessandroD
Post by Maurizio
Aprendo query molto estese potrai notare che all'atto dell'apertura della
query il testo viene compattato (tipico esempio i CASE WHEN che sono
messi uno dietro l'altro perdendo ogni forma di indentazione).
Mai successo, ne quando usavo il Query Analyzer di SQL 2000, ne ora con
SSMS di SQL 2005.
Certo è che non ho mai avuto viste tanto grosse da superare gli 8kb di
sorgente, quindi non so se esistono bachi dell'editor in questo senso.
============================================================================================
Premessa:
Lavoro direttamente con SQL Server Management Studiodi SQL Server 2005. Dopo
aver aperto il nodo del database che mi interessa apro ancora il sottonodo
relativo alle Views e da li eseguo "New View" o "Modify". All'apertura della
finestra relativa alla vista vado poi a gestire la query.

Di seguito riporto una query di esempio che può servire a farti capire quali
sono i problemi di indentazione. Come vedi la struttura della SELECT è ben
strutturata, facile da modificare; ora prova a creare una nuova vista
incolla la query sottostante e vedi il risultato. Il testo viene
riorganizzato e l'indentazione si perde. Immagina di avere una query ben
più articolata di questa e ti rendi conto che diventa molto poco agevole
lavorare con il query designer. E' quindi opportuno mantenere la definizione
della query altrove e generare la view partendo da tale definizione.
(diciamo che vorrei usare una stored per questo scopo)

SELECT
CASE
WHEN Campo1=0 THEN 'Zero'
WHEN Campo1=1 THEN 'Uno'
WHEN Campo1=6 THEN 'Sei'
WHEN Campo1>0 AND Campo2 <5 THEN 'Stabile'
END AS STP_Stato,
CASE
WHEN Campo2=0 THEN 'ZeroZero'
WHEN Campo2=1 THEN 'UnoUno'
WHEN Campo2=5 THEN 'SeiSei'
WHEN Campo2>0 AND Campo2 <5 THEN 'StabileStabile'
END AS STP_Stato_2
FROM Tabellax

Considerato che (dopo un bel dibattito :-D) ho capito che non è possibile
utilizzare direttamente il CREATE VIEW all'interno della stored resta
soltanto la strada dell'exec(@query).
Per memorizzare la query all'interno di una variabile (ammettiamo sia una
variabile di tipo varchar(max)) gli apici delle stringhe vanno raddoppiati
perchè la definizione della query diventa essa stessa una stringa da passare
all'exec. Di seguito allego la stored che serve allo scopo:
CREATE PROCEDURE PROVAZ
AS
BEGIN
DECLARE @query varchar(max)
set @query='CREATE VIEW dbo.VIEWZ AS
SELECT
CASE
WHEN Campo1=0 THEN ''Zero''
WHEN Campo1=1 THEN ''Uno''
WHEN Campo1=6 THEN ''Sei''
WHEN Campo1>0 AND Campo2 <5 THEN ''Stabile''
END AS STP_Stato,
CASE
WHEN Campo2=0 THEN ''ZeroZero''
WHEN Campo2=1 THEN ''UnoUno''
WHEN Campo2=6 THEN ''SeiSei''
WHEN Campo2>0 AND Campo2 <5 THEN ''StabileStabile''
END AS STP_Stato_2
FROM Tabellax'
exec @query
END

Come vedi è stato necessario aggiungere un ulteriore apice di apertura ed
uno di terminazione per ogni costante stringa contenuta nella query. Questo
genera una difformità dal testo originale della query. Se avessi la
necessità di provare la query (ad esempio per verificarla dopo una modifica
con un semplice copia-incolla nel query designer delle view) dovrei togliere
nuovamente tutti i doppi apici perchè in caso contrario otterrei degli
errori di sintassi.
Per risolvere questo ulteriore problema utilizzo SET QUOTED_IDENTIFIER OFF
in modo da poter delimitare la sola stringa della SELECT con i doppi apici
lasciando inalterata la query nel suo formato originale anche per quanto
riguarda gli apici singoli
La stored finale e funzionante diventa allora la seguente:
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER OFF
GO
ALTER PROCEDURE [dbo].[PROVAZ]
AS
BEGIN
declare @query varchar(max)

if object_id('dbo.VIEWZ') is not null
BEGIN
DROP VIEW dbo.VIEWZ
END

set @query="CREATE VIEW dbo.VIEWZ AS
SELECT
CASE
WHEN Campo1=0 THEN 'Zero'
WHEN Campo1=1 THEN 'Uno'
WHEN Campo1=6 THEN 'Sei'
WHEN Campo1>0 AND Campo2 <5 THEN 'Stabile'
END AS STP_Stato,
CASE
WHEN Campo2=0 THEN 'ZeroZero'
WHEN Campo2=1 THEN 'UnoUno'
WHEN Campo2=6 THEN 'SeiSei'
WHEN Campo2>0 AND Campo2 <5 THEN 'StabileStabile'
END AS STP_Stato_2
FROM Tabellax"
exec (@query)
END

Credo che avrei potuto utilizzare anche ALTER VIEW in sostituzione del DROP
e del successivo CREATE.
============================================================================================
Post by AlessandroD
In ogni caso anche se vuoi insistere con la creazione di viste passando
per una stored procedure che accetta un parametro varchar(max), e tenerti
da qualche parte i sorgenti delle viste, non hai nessun problema di
duplicazione di apici vari, visto che in ogni caso l'unica cosa che devi
fare è leggere il sorgente e richiamare la sp passando nel suo parametro
proprio l'intero sorgente.
Se la chiamata della sp la fai in modo corretto, quindi senza produrre a
tua volta un'altra sringa sql con dentro la chiamata alla sp e nidificato
all'interno della stringa anche tutto il sorgente della vista, ma passando
attraverso ADO o ADO.NET e facendo uso degli oggetti
command e parameter, vedrai che non avrai problemi (per essere più chiari
L'invocazione della stored viene eseguita da SSMS, la generazione della
query è a carico del DBA, non devo richiamarla da nessun applicativo. Si
tratta di stored ad uso interno per mantenere la definizione di alcune view
particolarmente impegnative.

Un grazie a tutti coloro che mi hanno risposto perchè il problema è stato
risolto con l'ausilio delle vostre risposte. La chiave sta nel fatto che
varchar(max) accetta più di 8000 caratteri.

Ciao a tutti
Maurizio
Post by AlessandroD
Post by Maurizio
Nell'esempio che ho riportato e che riporto di seguito cè solo il create
view, non ci sono istruzioni prima ne dopo a meno che le righe relative
alla definizione stessa della stored non siano considerate istruzioni.
La definizione della stored procedure è a tutti gli effetti un batch, dove
appunto il primo comando è il CREATE/ALTER della stored procedure, di
conseguenza non può esserci in qualunque altro punto anche uno create view.
il parametro relativo al comando exec, parametro il cui contenuto non
c'entra nulla, semanticamente parlando, con il batch corrente.
Che poi in fase di esecuzione la chiamata ad exec produca l'esecuzione di
un altro batch il cui corpo è dato dalla definizione della vista è un
altro discorso, che fra l'altro ti permette appunto di ottenere quello che
vuoi, anche se io ancora non ne capisco il motivo.
Post by Maurizio
In altri termini vorrei riuscire ad usare l'istruzione CREATE VIEW
all'interno di una stored procedure considerando che non posso usare
Puoi farmi un esempio funzionante? Io non ci sono riuscito.
Come ti ha già indicato Lorenzo puoi usare un parametro di ingresso di
CREATE PROCEDURE [dbo].[PROVA]
@sql varchar(max)
AS
return
go
exec dbo.PROVA 'CREATE VIEW dbo.VISTAX AS SELECT * FROM dbo.Anagrafiche'
una bella stringa lunga fino a 4GB...
Post by Maurizio
Per quanto riguarda la creazione e la modifiche delle viste non uso
wizard, uso i comandi "New view" e "Modify" direttamente sulla vista.
Aprendo query molto estese potrai notare che all'atto dell'apertura della
query il testo viene compattato (tipico esempio i CASE WHEN che sono
messi uno dietro l'altro perdendo ogni forma di indentazione).
Mai successo, ne quando usavo il Query Analyzer di SQL 2000, ne ora con
SSMS di SQL 2005.
Certo è che non ho mai avuto viste tanto grosse da superare gli 8kb di
sorgente, quindi non so se esistono bachi dell'editor in questo senso.
Post by Maurizio
Indentazione a parte il problema vero riguarda solo ed esclusivamente
l'utilizzo del comando CREATE VIEW all'interno di una stored senza usare
il comando exec. Da quello che fin qui ho visto sembra che non sia
possibile.
Inutile che insisti, stai cercando di fare una cosa che è documentata come
non fattibile... :-)
In ogni caso anche se vuoi insistere con la creazione di viste passando
per una stored procedure che accetta un parametro varchar(max), e tenerti
da qualche parte i sorgenti delle viste, non hai nessun problema di
duplicazione di apici vari, visto che in ogni caso l'unica cosa che devi
fare è leggere il sorgente e richiamare la sp passando nel suo parametro
proprio l'intero sorgente.
Se la chiamata della sp la fai in modo corretto, quindi senza produrre a
tua volta un'altra sringa sql con dentro la chiamata alla sp e nidificato
all'interno della stringa anche tutto il sorgente della vista, ma passando
attraverso ADO o ADO.NET e facendo uso degli oggetti
command e parameter, vedrai che non avrai problemi (per essere più chiari
"exec dbo.PROVA 'CREATE VIEW dbo.VISTAX AS SELECT * FROM dbo.Anagrafiche'"
e poi cercare di eseguirla in qualche modo dopo aver stabilito una
connessione verso SQL Server).
--
Ciao, Alessandro
/*
Alessandro Dereani - MVP SQL Server - http://mvp.support.microsoft.com
*/
AlessandroD
2008-05-17 08:05:57 UTC
Permalink
Come vedi la struttura della SELECT è ben strutturata, facile da
modificare; ora prova a creare una nuova vista incolla la query
sottostante e vedi il risultato. Il testo viene riorganizzato e
l'indentazione si perde.
O tu stai usando un versione di SSMS vecchia e quindi forse bacata per
quello che ti serve fare, oppure proprio non ci capiamo.
Quindi, per capire in che situazione ci troviamo fai, per favore,
esattamente quello che ti dico.
Per creare la prima volta la tua vista, clicchi sul bottone [New query] che
si trova dentro la barra degli strumenti standard.
Nella finestra che si apre ti posizioni nel DB di interesse e fai copia &
incolla della select che hai postato inserendo in testa il comando di
creazione di una vista, quindi alla fine ti troverai con una finestra di
query aperta e con dentro questo codice:

CREATE VIEW dbo.VIEWZ
AS
SELECT
CASE
WHEN Campo1=0 THEN 'Zero'
WHEN Campo1=1 THEN 'Uno'
WHEN Campo1=6 THEN 'Sei'
WHEN Campo1>0 AND Campo2 <5 THEN 'Stabile'
END AS STP_Stato,
CASE
WHEN Campo2=0 THEN 'ZeroZero'
WHEN Campo2=1 THEN 'UnoUno'
WHEN Campo2=5 THEN 'SeiSei'
WHEN Campo2>0 AND Campo2 <5 THEN 'StabileStabile'
END AS STP_Stato_2
FROM Tabellax

Dai un bel F5, il batch viene eseguito e tu ti trovi dentro il nodo delle
view una nuova vista con il nome dbo.VIEWZ.

Ora proviamo a modificarla in una nuova finestra in modo da verificare che
senza utilizzare il wizard grafico di progettazione delle query, il codice
che costituisce il corpo della view non viene in alcun modo modificato e/o
sporcato.
Ok, identifichi nel pannello di sx la nuova vista, clicchi con il dx e
scegli Edit (e NON Design, altrimenti ti parte il wizard grafico!), vedrai
che ti si aprirà una nuova query window con dentro il codice della tua vista
racchiuso in un alter view e con l'identazione di origine in alcun modo
modificata.
L'invocazione della stored viene eseguita da SSMS, la generazione della
query è a carico del DBA, non devo richiamarla da nessun applicativo. Si
tratta di stored ad uso interno per mantenere la definizione di alcune
view particolarmente impegnative.
Guarda, insisto che secondo me vi state complicando la vita davvero per
nulla, ma proprio per nulla, poi se avete pochi problemi da gestire e quindi
vi serve crearveli da voi, fate pure... :-)
Se usate nel modo che ho descritto SSMS *non* vi serve fare nulla attraverso
l'uso di vostre sp diciamo di sistema.
Poi, per carità, fate come desiderate, ci mancherebbe.
--
Ciao, Alessandro
/*
Alessandro Dereani - MVP SQL Server - http://mvp.support.microsoft.com
*/
Maurizio
2008-05-17 10:46:00 UTC
Permalink
Ho seguito le tue indicazioni, funziona tutto a meraviglia, grazie grazie
grazie!! :)
Mi accorgo soltanto ora di aver sempre usato il wizard grafico.

Un'ultima nota: Nel caso in cui dovessi attivare il wizard grafico e salvare
la view, l'indentazione verrà persa. Alla successiva riapertura della query
con il tasto di "Edit" verrà riproposto il testo della query come salvato
dal wizard, ma questo non rappresenta un problema, basta saperlo.

Grazie ancora a tutti voi
Ciao Maurizio
Post by AlessandroD
Come vedi la struttura della SELECT è ben strutturata, facile da
modificare; ora prova a creare una nuova vista incolla la query
sottostante e vedi il risultato. Il testo viene riorganizzato e
l'indentazione si perde.
O tu stai usando un versione di SSMS vecchia e quindi forse bacata per
quello che ti serve fare, oppure proprio non ci capiamo.
Quindi, per capire in che situazione ci troviamo fai, per favore,
esattamente quello che ti dico.
Per creare la prima volta la tua vista, clicchi sul bottone [New query]
che si trova dentro la barra degli strumenti standard.
Nella finestra che si apre ti posizioni nel DB di interesse e fai copia &
incolla della select che hai postato inserendo in testa il comando di
creazione di una vista, quindi alla fine ti troverai con una finestra di
CREATE VIEW dbo.VIEWZ
AS
SELECT
CASE
WHEN Campo1=0 THEN 'Zero'
WHEN Campo1=1 THEN 'Uno'
WHEN Campo1=6 THEN 'Sei'
WHEN Campo1>0 AND Campo2 <5 THEN 'Stabile'
END AS STP_Stato,
CASE
WHEN Campo2=0 THEN 'ZeroZero'
WHEN Campo2=1 THEN 'UnoUno'
WHEN Campo2=5 THEN 'SeiSei'
WHEN Campo2>0 AND Campo2 <5 THEN 'StabileStabile'
END AS STP_Stato_2
FROM Tabellax
Dai un bel F5, il batch viene eseguito e tu ti trovi dentro il nodo delle
view una nuova vista con il nome dbo.VIEWZ.
Ora proviamo a modificarla in una nuova finestra in modo da verificare che
senza utilizzare il wizard grafico di progettazione delle query, il codice
che costituisce il corpo della view non viene in alcun modo modificato e/o
sporcato.
Ok, identifichi nel pannello di sx la nuova vista, clicchi con il dx e
scegli Edit (e NON Design, altrimenti ti parte il wizard grafico!), vedrai
che ti si aprirà una nuova query window con dentro il codice della tua
vista racchiuso in un alter view e con l'identazione di origine in alcun
modo modificata.
L'invocazione della stored viene eseguita da SSMS, la generazione della
query è a carico del DBA, non devo richiamarla da nessun applicativo. Si
tratta di stored ad uso interno per mantenere la definizione di alcune
view particolarmente impegnative.
Guarda, insisto che secondo me vi state complicando la vita davvero per
nulla, ma proprio per nulla, poi se avete pochi problemi da gestire e
quindi vi serve crearveli da voi, fate pure... :-)
Se usate nel modo che ho descritto SSMS *non* vi serve fare nulla
attraverso l'uso di vostre sp diciamo di sistema.
Poi, per carità, fate come desiderate, ci mancherebbe.
--
Ciao, Alessandro
/*
Alessandro Dereani - MVP SQL Server - http://mvp.support.microsoft.com
*/
Marcello
2008-05-16 17:05:22 UTC
Permalink
Post by Maurizio
Nell'esempio che ho riportato e che riporto di seguito cè solo il create
view, non ci sono istruzioni prima ne dopo a meno che le righe relative alla
definizione stessa della stored non siano considerate istruzioni.
Ciao Maurizio,

mi sembra tutto un enorme incomprensione.
Certo create procedure sono considerate istruzioni, sono istruzioni infatti.

Se vuoi creare una vista evitando l'orrendo query designer ti basta fare
"Nuove query" in SSMS e scrivere a mano la tua vista, il Create
procedure non centra niente!

Quindi, banalmente esegui una cosa del tipo:

Create view pippo
as

select...
go
Post by Maurizio
In altri termini vorrei riuscire ad usare l'istruzione CREATE VIEW
all'interno di una stored procedure
Come ti è stato detto molte volte

1) non si può
2) non è un bug
Post by Maurizio
considerando che non posso usare
Ricorda che varchar(max) accetta molto più di 8000 caratteri.
Post by Maurizio
Indentazione a parte il problema vero riguarda solo ed esclusivamente
l'utilizzo del comando CREATE VIEW all'interno di una stored senza usare il
comando exec. Da quello che fin qui ho visto sembra che non sia possibile.
Che client stai usando per lavorare?
Post by Maurizio
Grazie
Ciao
marc.
Loading...