Funzione Visual Basic in Sql Server

giovedì 09 dicembre 2010 - 16.09
Tag Elenco Tags  VB.NET  |  SQL Server 2008 R2

mcfede88 Profilo | Newbie

Ciao a tutti,
dovrei inserire una funzione scritta in visual basic all'interno di Sql Server 2008.
Come devo fare?

Grazie Mille

lbenaglia Profilo | Guru

>dovrei inserire una funzione scritta in visual basic all'interno
>di Sql Server 2008.
>Come devo fare?

Se è VB.NET potresti sfruttare l'integrazione del CLR in SQL Server 2008 anche se ti ricordo che l'uso di tale tecnica va attentamente valutato se non vuoi incorrere in problemi sia di performance che di affidabilità.
Prenditi un po' di tempo ed inizia a studiare questi paragrafi dei Books Online:
http://msdn.microsoft.com/en-us/library/ms131102.aspx

>Grazie Mille
Prego.

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

mcfede88 Profilo | Newbie

Ciao,
ho abilitato il CLR su Sql Server 2008 solo che non ho capito cosa passare alla vista affinchè faccia riferimento alla mia dll che si chiama 'ProvaVB'.

Grazieeeeeee

lbenaglia Profilo | Guru

>ho abilitato il CLR su Sql Server 2008 solo che non ho capito
>cosa passare alla vista affinchè faccia riferimento alla mia
>dll che si chiama 'ProvaVB'.

Di che vista stai parlando?
In questo post troverai un veloce esempio sulla registrazione di una sp CLR:
http://blogs.dotnethell.it/lorenzo/Come-esportare-su-file-una-foto-con-SQL-Server-2005__11051.aspx

Nel caso di assembly EXTERNAL_ACCESS|UNSAFE, potresti migliorare ulteriormente la sicurezza evitando di impostare a ON la proprietà TRUSTWORTHY del db firmando digitalmente il tuo assembly, creando una chiave asimmetrica recuperandola dall'assembly stesso, una login basata su di essa ed assengare le permission di ASSEMBLY EXTERNAL_ACCESS|UNSAFE alla login.

>Grazieeeeeee
Prego.

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

mcfede88 Profilo | Newbie

In pratica ho seguito tutta la prassi ed ho generato l'assembly nominato Prova.

Adesso io devo eseguire una select utilizzando questa funzione solo che non capisco come fare a passarla.
Nel senso che precedentemente avevo fatto una funzione in T-SQL ed andava ok passandola nella Select
adesso mi è stato detto di fare la stessa in VB così è più veloce ma non capisco come utilizzarla.
Di seguito la select:

select RTRIM(LTRIM(UPPER(T_INDCOMCOD))), LOCALITA, T_NAGINT, T_CAP, T_PR from ANAGRAFE_GENERALE.dbo.ANA_STOIND join dbo.TTLS ON dbo.prova --usavo questo per collegarmi alla funzione scritta in T-SQL (RTRIM(LTRIM(UPPER(T_INDCOMCOD))), LOCALITA) = 1 WHERE T_CAP = CAP AND RTRIM(LTRIM(UPPER(T_INDCOMCOD))) NOT IN(SELECT LOCALITA FROM dbo.TTLS) AND RTRIM(LTRIM(UPPER(T_INDCOMCOD))) IS NOT NULL AND RTRIM(LTRIM(UPPER(T_INDCOMCOD))) NOT LIKE '' AND RTRIM(LTRIM(UPPER(T_INDCOMCOD))) NOT LIKE '.' AND RTRIM(LTRIM(UPPER(T_INDCOMCOD))) NOT LIKE '/'

lbenaglia Profilo | Guru

>Adesso io devo eseguire una select utilizzando questa funzione
>solo che non capisco come fare a passarla.
>Nel senso che precedentemente avevo fatto una funzione in T-SQL
>ed andava ok passandola nella Select
>adesso mi è stato detto di fare la stessa in VB così è più veloce
>ma non capisco come utilizzarla.
Non so cosa tu intenda con "passarla", ma lato T-SQL non esiste alcuna differenza tra il richiamare una funzione nativa T-SQL ed una CLR.


>Di seguito la select:
>
>
>select RTRIM(LTRIM(UPPER(T_INDCOMCOD))), LOCALITA, T_NAGINT,
>T_CAP, T_PR from
>ANAGRAFE_GENERALE.dbo.ANA_STOIND
>join dbo.TTLS
>ON dbo.prova --usavo questo per collegarmi alla funzione scritta
>in T-SQL
>(RTRIM(LTRIM(UPPER(T_INDCOMCOD))), LOCALITA) = 1
>WHERE T_CAP = CAP AND RTRIM(LTRIM(UPPER(T_INDCOMCOD))) NOT IN(SELECT
>LOCALITA FROM dbo.TTLS)
>AND RTRIM(LTRIM(UPPER(T_INDCOMCOD))) IS NOT NULL AND RTRIM(LTRIM(UPPER(T_INDCOMCOD)))
>NOT LIKE ''
>AND RTRIM(LTRIM(UPPER(T_INDCOMCOD))) NOT LIKE '.' AND RTRIM(LTRIM(UPPER(T_INDCOMCOD)))
>NOT LIKE '/'
>

Quella condizione di WHERE è SPAVENTOSA e darà origine ad un piano di esecuzione estremamente inefficiente.
A che servono tutte quelle xTRIM, quelle UPPER e quelle LIKE?
La collation delle colonne è case sensitive o insensitive?
Non puoi bonificare i dati in tabella eliminando a priori eventuali spazi?

Inoltre non capisco la JOIN tra le due tabelle dato che la clausola ON è errata.

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

mcfede88 Profilo | Newbie

Mi stavo concentrando più sul CLR visto che senza non funziona però la ON se la uso con la funzione scritta in T-SQL funziona se invece metto il nome
dell'Assembly non va.
C'è qualche esempio su come passare ad una select una funzione CLR?

mcfede88 Profilo | Newbie

Ho letto un altro sempre su questo forum dove viene detto che dopo la creazione dell'assembly bisogna dare:
CREATE FUNCTION

Qualcuno mi potrebbe spiegare quali sono i parametri da passare al CREATE FUNCTION?

lbenaglia Profilo | Guru

>Ho letto un altro sempre su questo forum dove viene detto che
>dopo la creazione dell'assembly bisogna dare:
>CREATE FUNCTION
>
>Qualcuno mi potrebbe spiegare quali sono i parametri da passare
>al CREATE FUNCTION?
Nell'esempio che ti ho postato, il prototipo della stored procedure CLR è:

[Microsoft.SqlServer.Server.SqlProcedure] public static void SaveBLOBToFile(Byte[] Data, String DestFile)

Per "fare vedere" questa stored procedure CLR a SQL Server occorre importare l'intero assembly e successivamente definire la procedura nel seguente modo:

/* Creo la stored procedure dbo.up_SaveBLOBToFile */ CREATE PROCEDURE dbo.up_SaveBLOBToFile @Data varbinary(max), @DestFile nvarchar(256) WITH EXECUTE AS CALLER AS EXTERNAL NAME [SQLCLRUtility].[StoredProcedures].[SaveBLOBToFile];

Tu dovrai fare una cosa analoga in base al prototipo della tua funzione, modificando CREATE PROCEDURE in CREATE FUNCTION:
http://msdn.microsoft.com/it-it/library/ms186755.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
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