STORE PROCEDURE

lunedì 18 luglio 2011 - 14.38
Tag Elenco Tags  SQL Server 2008 R2  |  SQL Server 2008  |  SQL Server 2005  |  SQL Server 2000  |  SQL Server Express  |  MSDE

gsflash80 Profilo | Junior Member

Ciao a tutti, sto facendo i store procedure, ma mi sono fermato con una piccola difficoltà che ho provato molte volte a capire di dove ho sbagliato:

ho creato add_column nel store procedure, però anche insert_log che serve per vedere i comandi eseguiti con la versione dell'applicazione e anche gli esiti.

il file INSERT_LOG

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author: Gabriele S.

-- Create date: 11/07/2011

-- Description:

-- =============================================

CREATE PROCEDURE DOCSADM.insert_log

-- Add the parameters for the stored procedure here

@nome_utente Nvarchar(200),

@comando_eseguito Nvarchar (200),

@versione_CD Nvarchar(200),

@esito Nvarchar(200)



AS

BEGIN



DECLARE @istruzione Nvarchar(2000)

DECLARE @data_eseguito Nvarchar (200)



set @data_eseguito = (select convert (varchar, getdate(), 113))



SET @istruzione = N'INSERT INTO '+@nome_utente +'.DPA_LOG_INSTALL VALUES ('',

'+@data_eseguito+',

'+@comando_eseguito+',

'+@versione_CD+',

'+@esito+')'



execute sp_executesql @istruzione



END

GO

L'ERRORE RISPONDE CHE QUANDO FACCIO EXECUTE, RISULTA CHE NELLA DATE NON VA BENE.. DOVREI METTERE CONVERT 131? MA NON VOGLIO CHE METTA DD MMM AAAA HH:MM:SS:MM, MA VORREI DD/MM/AAAA HH:MM:SS H24




il file di ADD_COLUMN

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author: Gabriele S.

-- Create date: 11/07/2011

-- Description:

-- =============================================

ALTER PROCEDURE DOCSADM.add_column

-- Add the parameters for the stored procedure here

@versioneCD Nvarchar(200),

@nome_utente Nvarchar(200),

@nome_tabella Nvarchar(200),

@nome_colonna Nvarchar(200),

@tipo_dato Nvarchar(200),

@val_default Nvarchar(200),

@condizione_modifica_pregresso Nvarchar(200),

@condizione_check Nvarchar(200),

@RFU Nvarchar(200)

AS

BEGIN

if not exists(select * from syscolumns where name=@nome_colonna and id in

(select id from sysobjects where name=@nome_tabella and xtype='U'))

BEGIN

DECLARE @istruzione Nvarchar(2000)

--DECLARE @insert_log Nvarchar(2000)



--SET @insert_log = docasdm.insert_log

SET @istruzione = N'alter table [' + @nome_utente + '].

[' + @nome_tabella + '] ADD ' + @nome_colonna +'

'+ @tipo_dato +' '

execute sp_executesql @istruzione

execute sp_executesql insert_log @nome_utente,

NULL,

'Added column on' +@nome_tabella+,

@versione_CD,

'esito positivo'



end

SET NOCOUNT ON;

l'errore è Incorrect syntax near '@nome_utente'. è quello dove ce insert_log



-- Insert statements for procedure here

SELECT @versioneCD,

@nome_utente,

@nome_tabella,

@nome_colonna,

@tipo_dato,

@val_default,

@condizione_modifica_pregresso,

@condizione_check,

@RFU

END

GO



GRAZIE MILLE (UNO DEI MILLE GARIBALDINI) :D
----

..:: GSFLASH ::..
http://www.gsflash.it
http://blogs.dotnethell.it/gabrieleserpi/
MCTS - ACP - OCP - ECDL - ACSP
Ubuntu 11.04/OpenSuse 10.3
Vista Seven/MacOSX SnowLeopard

lbenaglia Profilo | Guru

>L'ERRORE RISPONDE CHE QUANDO FACCIO EXECUTE, RISULTA CHE NELLA
>DATE NON VA BENE.. DOVREI METTERE CONVERT 131? MA NON VOGLIO
>CHE METTA DD MMM AAAA HH:MM:SS:MM, MA VORREI DD/MM/AAAA HH:MM:SS
>H24

Ciao,

Le date sono definite come una coppia di numeri interi (uno per la parte data e uno per quella oraria).
I numeri come tali non hanno formato ma sarà opera delle applicazioni client applicare una formattazione in base alle regional options impostate su ogni client.

Par maggiori informazioni su questo data type leggi con molta attenzione questo articolo di Tibor:
http://www.karaszi.com/SQLServer/info_datetime.asp

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

gsflash80 Profilo | Junior Member

ti ringrazio del link e ho già trovato.

Ma solo vorrei capire dove ho sbagliato, ad esempio nel insert_log, quando metto insert, mi risulta:

Unclosed quotation mark after the character string ',
20110718,
Add Column,
3.14.3,
NEGATIVO)'.

era quello nel @istruzione

invece add_column quando dovrei fare execute insert_log, non capisco dove ho sbagliato...
grazie ancora
----

..:: GSFLASH ::..
http://www.gsflash.it
http://blogs.dotnethell.it/gabrieleserpi/
MCTS - ACP - OCP - ECDL - ACSP
Ubuntu 11.04/OpenSuse 10.3
Vista Seven/MacOSX SnowLeopard

lbenaglia Profilo | Guru

>Ma solo vorrei capire dove ho sbagliato, ad esempio nel insert_log,
>quando metto insert, mi risulta:
>
>Unclosed quotation mark after the character string ',
> 20110718,
> Add Column,
> 3.14.3,
> NEGATIVO)'.
>
>era quello nel @istruzione
>
>invece add_column quando dovrei fare execute insert_log, non
>capisco dove ho sbagliato...

Ah boh
Ti posso solo dire che tutte le colonne stringa vanno racchiuse tra singoli apici (') e se sono UNICODE come le tue occorre specificare N'....' per evitare un cast implicito.
Tra l'altro, sei sicuro che ti servano effettivamente UNICODE? E per quale motivo tutti i parametri sono definiti nvarchar(200)?

>grazie ancora
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

gsflash80 Profilo | Junior Member

SET @istruzione = N'INSERT INTO '+@nome_utente +'.DPA_LOG_INSTALL VALUES ('',
'+@data_eseguito+',
'+@comando_eseguito+',
'+@versione_CD+',
'+@esito+')'

mi è sembrato che si chiuso....

nvarchar, gli sviluppatori di visual studio mi hanno detto che devono essere con N, anche se io ho pensato che non servirebbe...

poi

BEGIN
DECLARE @istruzione Nvarchar(2000)
--DECLARE @insert_log Nvarchar(2000)

--SET @insert_log = docasdm.insert_log
SET @istruzione = N'alter table [' + @nome_utente + '].
[' + @nome_tabella + '] ADD ' + @nome_colonna +'
'+ @tipo_dato +' '
execute sp_executesql @istruzione
execute sp_executesql insert_log @nome_utente,
NULL,
'Added column on' +@nome_tabella+,
@versione_CD,
'esito positivo'

end

quello insert_log @nome_utente, è quello che è sottolineato per l'errore, MAH!
----

..:: GSFLASH ::..
http://www.gsflash.it
http://blogs.dotnethell.it/gabrieleserpi/
MCTS - ACP - OCP - ECDL - ACSP
Ubuntu 11.04/OpenSuse 10.3
Vista Seven/MacOSX SnowLeopard

lbenaglia Profilo | Guru

> SET @istruzione = N'INSERT INTO '+@nome_utente +'.DPA_LOG_INSTALL
>VALUES ('',
> '+@data_eseguito+',
> '+@comando_eseguito+',
> '+@versione_CD+',
> '+@esito+')'
>
>mi è sembrato che si chiuso....
Cosa si è chiuso? Fai una PRINT @istruzione e vedrai con i tuoi occhi dove sta l'errore

>nvarchar, gli sviluppatori di visual studio mi hanno detto che
>devono essere con N, anche se io ho pensato che non servirebbe...
Da ex sviluppatore ti dico che "fai bene" a fidarti di loro (sono ironico, sia chiaro ).

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

gsflash80 Profilo | Junior Member

infatti, hai ragione, ho usato print @istruzione e ho visto che non si vedono le apici.

ho usato

SET @istruzione = N'INSERT INTO '+@nome_utente +'.DPA_LOG_INSTALL VALUES ('''',
'''+@data_eseguito+''',
'''+@comando_eseguito+''',
'''+@versione_CD+''',
'''+@esito+''')'

(madonna quanti apici!! )

e invece quello execute insert_log nel add_column come funziona?

invece per gli sviluppatori, dovrei dire a loro che non conviene N?
----

..:: GSFLASH ::..
http://www.gsflash.it
http://blogs.dotnethell.it/gabrieleserpi/
MCTS - ACP - OCP - ECDL - ACSP
Ubuntu 11.04/OpenSuse 10.3
Vista Seven/MacOSX SnowLeopard

lbenaglia Profilo | Guru

>e invece quello execute insert_log nel add_column come funziona?

Sostituisci:

execute sp_executesql insert_log...

con

EXEC DOCSADM.insert_log...

>invece per gli sviluppatori, dovrei dire a loro che non conviene
>N?
Leggi questo paragrafo dei BOL e quelli correlati:
http://msdn.microsoft.com/en-us/library/ms187828.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

gsflash80 Profilo | Junior Member

ecco, ho visto il link, credo che nell'XML che hanno usato gli sviluppatore, avranno usato quello in italiano, ci provo a parlare con mio collega che usiamo gli scripts per gli sviluppatori.

Poi EXEC DOCSADM.insert_log

execute DOCSADM.insert_log @nome_utente,
NULL,
'Added column on' @nome_tabella,
@versione_CD,
'esito positivo'


E L'ERRORE DICE ERROR SYNTAX @NOME_TABELLA, ho già provato a mettere + @nome_tabella +, nemmeno non funziona


----

..:: GSFLASH ::..
http://www.gsflash.it
http://blogs.dotnethell.it/gabrieleserpi/
MCTS - ACP - OCP - ECDL - ACSP
Ubuntu 11.04/OpenSuse 10.3
Vista Seven/MacOSX SnowLeopard

lbenaglia Profilo | Guru

>ecco, ho visto il link, credo che nell'XML che hanno usato gli
>sviluppatore, avranno usato quello in italiano, ci provo a parlare
>con mio collega che usiamo gli scripts per gli sviluppatori.
>
>Poi EXEC DOCSADM.insert_log
>
> execute DOCSADM.insert_log @nome_utente,
> NULL,
> 'Added column on' @nome_tabella,
> @versione_CD,
> 'esito positivo'
>
>
>E L'ERRORE DICE ERROR SYNTAX @NOME_TABELLA, ho già provato a
>mettere + @nome_tabella +, nemmeno non funziona

C'è un "+" di troppo:

EXEC DOCSADM.insert_log @nome_utente , NULL , 'Added column on' + @nome_tabella , @versione_CD , 'esito positivo';

Occhio che nella definizione della sp che hai postato sono previsti 4 parametri mentre in questa chiamata ne vedo 5...

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

gsflash80 Profilo | Junior Member

è uguale anche se ho messo come hai scritto tu

EXEC DOCSADM.insert_log
@nome_utente
, NULL
, 'Added column on' + @nome_tabella
, @versione_CD
, 'esito positivo';

errore:
Incorrect syntax near '+'.

più in insert_log ci sono solo quattro perchè in date ho messo DECLARE del data_eseguito e per questo ho messo NULL

set @data_eseguito = (select convert (varchar, getdate(), 121))

poi ho chiesto al collega e mi ha risposto:

"perché li passiamo in input a execute_sp
quella SP di sistema, li vuole come nvarchar"
----

..:: GSFLASH ::..
http://www.gsflash.it
http://blogs.dotnethell.it/gabrieleserpi/
MCTS - ACP - OCP - ECDL - ACSP
Ubuntu 11.04/OpenSuse 10.3
Vista Seven/MacOSX SnowLeopard

lbenaglia Profilo | Guru

>è uguale anche se ho messo come hai scritto tu
>
>EXEC DOCSADM.insert_log
> @nome_utente
> , NULL
> , 'Added column on' + @nome_tabella
> , @versione_CD
> , 'esito positivo';
>
>errore:
>Incorrect syntax near '+'.
Allora concatena il valore e assegnalo ad una variabile prima di passarlo come parametro alla sp.

>più in insert_log ci sono solo quattro perchè in date ho messo
>DECLARE del data_eseguito e per questo ho messo NULL
>
>set @data_eseguito = (select convert (varchar, getdate(), 121))
Non ho capito.

>poi ho chiesto al collega e mi ha risposto:
>
>"perché li passiamo in input a execute_sp
>quella SP di sistema, li vuole come nvarchar"
E perché utilizzate il dynamic sql?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

gsflash80 Profilo | Junior Member

avevi scritto che nel insert_log c'erano solo 4:

@nome_utente Nvarchar(200),
@comando_eseguito Nvarchar (200),
@versione_CD Nvarchar(200),
@esito Nvarchar(200)


e invece nell'istruzione insert_log ci sono 5

SET @istruzione = N'INSERT INTO '+@nome_utente +'.DPA_LOG_INSTALL VALUES ('''',
'''+@data_eseguito+''',
'''+@comando_eseguito+''',
'''+@versione_CD+''',
'''+@esito+''')'

perchè data_eseguito si trova dopo BEGIN e DECLARE data_eseguito

per questo durante l'exec insert_log ho messo NULL per far permettere di inserire la data_eseguito, non va bene?


poi non ho capito scusa per cosa significa concatenare quello + @nome_tabella.....
----

..:: GSFLASH ::..
http://www.gsflash.it
http://blogs.dotnethell.it/gabrieleserpi/
MCTS - ACP - OCP - ECDL - ACSP
Ubuntu 11.04/OpenSuse 10.3
Vista Seven/MacOSX SnowLeopard

lbenaglia Profilo | Guru

>per questo durante l'exec insert_log ho messo NULL per far permettere
>di inserire la data_eseguito, non va bene?
No, se i parametri della sp sono 4, devi passare 4 valori.

>poi non ho capito scusa per cosa significa concatenare quello
>+ @nome_tabella.....
Definisci una variabile, valorizzala concatenando la stringa alla variabile e passala come parametro alla sp.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

gsflash80 Profilo | Junior Member

queste sp funzionano solo se usi dynamic sql
sennò come fa a creare una colonna senza sapere come si chiama? senza saperlo prima intendo?
è il motivo per cui nasce l'SQL dinamico....

poi per data_eseguito ho cambiato mettendo @data_eseguito sopra del begin

@nome_utente Nvarchar(200),
@data_eseguito NVARCHAR(200),
@comando_eseguito Nvarchar (200),
@versione_CD Nvarchar(200),
@esito Nvarchar(200)




DECLARE @istruzione Nvarchar(2000)
--DECLARE @data_eseguito Nvarchar (200)

SET IDENTITY_INSERT DOCSADM.DPA_LOG_INSTALL ON <--------------------
set @data_eseguito = (select convert (varchar, getdate(), 120))

però ce altro errore su IDENTITY_INSERT perchè ho ricevuto l'altro errore:
An explicit value for the identity column in table 'DOCSADM.DPA_LOG_INSTALL' can only be specified when a column list is used and IDENTITY_INSERT is ON.

per questo non ho mai ricevuto l'errore come questo.....
----

..:: GSFLASH ::..
http://www.gsflash.it
http://blogs.dotnethell.it/gabrieleserpi/
MCTS - ACP - OCP - ECDL - ACSP
Ubuntu 11.04/OpenSuse 10.3
Vista Seven/MacOSX SnowLeopard

lbenaglia Profilo | Guru

>queste sp funzionano solo se usi dynamic sql
>sennò come fa a creare una colonna senza sapere come si chiama?
>senza saperlo prima intendo?
Ma che senso ha una sp che usa Dynamic SQL in questo modo?

>è il motivo per cui nasce l'SQL dinamico....
Si, vabbé...

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

gsflash80 Profilo | Junior Member

beh lascio perdere, è da 10 anni che lavorano in questo progetto e io sono entrato da poco, cioè da due mesi... vabbeh..

comunque sono più disperato per SP, sempre quello +@nome_tabella del add_column e identity_insert del install_log.

Se riesco a risolvare questi, così potrei fare molti SP che mi hanno chiesto
----

..:: GSFLASH ::..
http://www.gsflash.it
http://blogs.dotnethell.it/gabrieleserpi/
MCTS - ACP - OCP - ECDL - ACSP
Ubuntu 11.04/OpenSuse 10.3
Vista Seven/MacOSX SnowLeopard

gsflash80 Profilo | Junior Member

Ho risolto in questo modo:

ALTER PROCEDURE [DOCSADM].[add_column]
-- Add the parameters for the stored procedure here
@versioneCD Nvarchar(200),
@nome_utente Nvarchar(200),
@nome_tabella Nvarchar(200),
@nome_colonna Nvarchar(200),
@tipo_dato Nvarchar(200),
@val_default Nvarchar(200),
@condizione_modifica_pregresso Nvarchar(200),
@condizione_check Nvarchar(200),
@RFU Nvarchar(200)
AS
BEGIN
if not exists(select * from syscolumns where name=@nome_colonna and id in
(select id from sysobjects where name=@nome_tabella and xtype='U'))
BEGIN
DECLARE @istruzione Nvarchar(2000)
DECLARE @insert_log Nvarchar(2000)
DECLARE @data_eseguito Nvarchar(2000)

set @data_eseguito = (select convert (varchar, getdate(), 120))

SET @istruzione = N'alter table [' + @nome_utente + '].
[' + @nome_tabella + '] ADD ' + @nome_colonna +'
'+ @tipo_dato +' '


SET @insert_log = N'INSERT INTO '+@nome_utente +'.DPA_LOG_INSTALL VALUES (
'''+@data_eseguito+''',
''Added column ' +@nome_colonna+' on '+@nome_tabella+''',
'''+@versioneCD+''',
''esito positivo'')'


execute sp_executesql @istruzione
exec(@insert_log)
end
end



però una cosa che vorrei sapere come si fa: se l'insert non è andato bene (colonna già esistente, o tabella non esistente), vorrei inserire nel log (DPA_LOG_INSTALL) mettendo negativo....
Grazie
----

..:: GSFLASH ::..
http://www.gsflash.it
http://blogs.dotnethell.it/gabrieleserpi/
MCTS - ACP - OCP - ECDL - ACSP
Ubuntu 11.04/OpenSuse 10.3
Vista Seven/MacOSX SnowLeopard

gsflash80 Profilo | Junior Member

ho risolto.

dopo exec(@insert_log)

else

begin
set @data_eseguito = (select convert (varchar, getdate(), 120))

SET @insert_log = N'INSERT INTO '+@nome_utente +'.DPA_LOG_INSTALL VALUES (
'''+@data_eseguito+''',
''Added column ' +@nome_colonna+' on '+@nome_tabella+''',
'''+@versioneCD+''',
''esito negativo'')'

exec(@insert_log)
end



grazie a tutti ;-)
----

..:: GSFLASH ::..
http://www.gsflash.it
http://blogs.dotnethell.it/gabrieleserpi/
MCTS - ACP - OCP - ECDL - ACSP
Ubuntu 11.04/OpenSuse 10.3
Vista Seven/MacOSX SnowLeopard
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5