Domanda

So come script di una stored procedure utilizzando PowerShell e SMO:

[System.reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo")  | out-null
$srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" 
$srv.databases['MyDatabase'].StoredProcedures['MyProc'].TextBody

Ma dal momento che voglio utilizzare il testo procedimento all'interno di una query, mi chiedo se posso chiamare SMO in qualche modo all'interno di puro T-SQL.

devono funzionare solo in ambiente di sviluppo.

A proposito:. Una funzione di restituire la definizione di una stored procedure con un dato nome sarebbe risolvere il mio problema attuale, ma non rispondere alla mia domanda

Modifica:

Voglio trovare quale procedure di riferimento una determinata tabella quando uso questa domanda:

SELECT p.name --, definition 
FROM sys.sql_modules m
join sys.objects p on m.object_id = p.object_id
where p.type = 'P'
and definition like '%SearchForThis%'

Questa è esattamente la stessa informazione che voglio ottenere utilizzando SMO.

È stato utile?

Soluzione

devi usare il sp_OA% stored procedure per questo. O CLR poiché SQL Server 2005.

Non può essere fatto tramite T-SQL direttamente a causa T-SQL è per la manipolazione dei dati. Quindi, è necessario utilizzare uno dei 2 metodi di cui sopra. A meno che non si desidera utilizzare xp_cmdshell per eseguire uno script PowerShell.

Questo porta anche a una limitazione di T-SQL: come ottenere una definizione di oggetto su disco? E credo che uno dei motivi per cui hai chiesto questo. Anche in questo caso, CLR o sp_OA% lo farà.

Una cosa da notare è che quasi tutti metodo e proprietà in SMO associato a un comando SQL o una query. Quindi, utilizzando T-SQL per chiamare SMO che è effettivamente T-SQL è circolare.

E per ottenere la definizione di stored procedure usereste OBJECT_DEFINITION ... per arrivare le altre proprietà disponibili in SMO usereste OBJECT_PROPERTY o interrogare gli oggetti di sistema.

Altri suggerimenti

Per quanto riguarda la questione come si è detto (e non il desiderio come indicato nel " Modifica "):

NO, non è possibile chiamare SMO da T-SQL. Non può essere fatto tramite le procedure di automazione OLE stored (cioè sp_OA*), né con SQLCLR.

automazione OLE

Non sono sicuro di quello che il OLEComponent nome sarebbe stato, ma è possibile creare oggetti specificando il clsid . Naturalmente, trovando che per SMO non è facile neanche, ma ho trovato due riferimenti nella inter-Webz:

  1. quello che è il CLSID e PROG ID di Microsoft.SqlServer.Management.Smo (su Stack Overflow)
  2. Per create.NET oggetto dalla semplice JScript. (su Città del programmatore)
DECLARE @ObjectToken INT, @HResult INT;
DECLARE @Source VARCHAR(500), @Description VARCHAR(500);

EXEC @HResult = sp_OACreate '{603F0A84-5631-3CA0-BCE0-C96597C2C1A0}', @ObjectToken OUT;
--EXEC @HResult = sp_OACreate '{755F7A20-E39C-31E0-8174-2E430C2C4E7A}', @ObjectToken OUT;

IF (@HResult <> 0)
BEGIN
   EXEC sp_OAGetErrorInfo @ObjectToken, @Source OUT, @Description OUT;
   RAISERROR('OLE Automation error. HResult: %x; @Source: %s; @Description: %s',
             16, 1, @HResult, @Source, @Description);
   RETURN;
END;

EXEC sp_OADestroy @ObjectToken;

Entrambi i valori di ritorno:

Msg 50000, livello 16, stato 1, riga 14
Errore di automazione OLE. HResult: 80040154; @Source: Extended procedure ODSOLE; @Description: La classe non registrata

Anche se SMO è COM-visibile, ho il sospetto che non lavorare qui è legata alla seguente requisito, che è riportata nella pagina MSDN per sp_OACreate

L'oggetto OLE specificato deve essere valido e deve supportare il IDispatch di interfaccia.

La biblioteca SMO non appare per implementare l'interfaccia IDispatch.

Anche se qualcuno riesce a trovare un modo per ottenere questo lavoro, è ancora mal consigliato se si considera che le stored procedure di automazione OLE sono stati deprecati dopo il rilascio di SQL Server 2005.

SQLCLR

Mentre SQLCLR sembrerebbe il modo naturale per andare con SMO (dal SMO è anche NET), questo non sicuramente non il lavoro come la libreria SMO rileva in particolare se viene utilizzato all'interno di SQL Server, e in caso affermativo, si interrompe con il seguente messaggio di errore:

Msg 6522, livello 16, stato 2, riga 1
Si è verificato un errore di .NET Framework durante l'esecuzione della routine definita dall'utente o aggregate "SmoTest":
System.Exception: Questa funzionalità è disabilitata nel SQLCLR. Si consiglia di eseguire dall'applicazione client.
System.Exception:
a Microsoft.SqlServer.Management.Common.ConnectionManager..ctor ()
a Microsoft.SqlServer.Management.Smo.Server..ctor ()

Non v'è alcun modo per aggirare questo (beh, a meno che siate Microsoft;).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top