Question

Je sais comment le script d'une procédure stockée en utilisant PowerShell et 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

Mais puisque je veux utiliser le texte de procédure dans une requête, je me demande si je peux appeler SMO en quelque sorte au sein de T-SQL pur.

ne doit fonctionner dans un environnement de développement.

BTW:. Fonction A retourner la définition d'une procédure stockée avec un nom donné résoudrait mon problème actuel, mais pas répondre à ma question

Edit:

Je veux trouver des procédures qui référence à une table donnée lorsque j'utilise cette requête:

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%'

C'est exactement la même information que je veux obtenir l'aide de SMO.

Était-ce utile?

La solution

Vous userait sp_OA% procs stockés pour cela. Ou CLR depuis SQL Server 2005.

Il ne peut pas être fait via T-SQL directement parce que T-SQL est pour la manipulation de données. Donc, vous devez utiliser l'une des 2 méthodes ci-dessus. À moins que vous souhaitez utiliser xp_cmdshell pour exécuter un script Powershell.

soulève aussi une limitation de T-SQL: comment obtenir une définition de l'objet sur le disque? Et je suppose que l'une des raisons pour laquelle vous avez posé. Encore une fois, CLR ou sp_OA% le fera.

Une chose à noter est que presque tous méthode et propriété SMO cartes pour une commande SQL ou une requête. Donc, en utilisant T-SQL pour appeler SMO qui est effectivement T-SQL est circulaire.

Et pour obtenir la définition de procédure stockée que vous souhaitez utiliser OBJECT_DEFINITION ... pour obtenir les autres propriétés disponibles à SMO vous utiliseriez OBJECT_PROPERTY ou interroger les objets du système.

Autres conseils

En ce qui a trait à la question comme indiqué (et non le désir comme indiqué dans le " Modifier "):

NON, il est impossible d'appeler SMO de T-SQL. Il ne peut se faire via les procédures stockées OLE Automation (à savoir sp_OA*), ni via SQLCLR.

OLE Automation

Je ne suis pas sûr de ce que OLEComponent nom serait, mais vous pouvez créer des objets en spécifiant leur CLSID . Bien sûr, concluant que, pour SMO n'est pas facile non plus, mais je ne trouve deux références dans l'inter-webz:

  1. ce qui est le CLSID et PROG ID Microsoft.SqlServer.Management.Smo (débordement de la pile)
  2. Pour objet create.NET de la simple JScript. (sur ville de programmeur)
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;

Les deux valeurs reviennent:

  

Msg 50000, niveau 16, état 1, ligne 14
  OLE erreur Automation. HResult: 80040154; @Source: ODSOLE étendue Procédure; @Description: Classe non enregistrée

Même si SMO est COM visible, je pense qu'il ne fonctionne pas ici est liée à l'exigence suivante, qui est indiqué dans la page MSDN pour sp_OACreate

  

L'objet OLE spécifié doit être valide et doit prendre en charge le IDispatch interface.

La bibliothèque SMO ne semble pas implémenter l'interface IDispatch.

Même si quelqu'un réussit à trouver un moyen d'obtenir ce travail, il est encore malavisés considérant que les procédures stockées OLE Automation ont été dépréciées depuis la version de SQL Server 2005.

SQLCLR

Alors que SQLCLR semblerait que la façon naturelle d'aller avec SMO (depuis SMO est également .NET), cela ne fonctionnera certainement pas la bibliothèque de SMO détecte spécifiquement si elle est utilisée dans SQL Server, et si oui, Abandonne avec le message d'erreur suivant:

  

Msg 6522, niveau 16, état 2, ligne 1
  Une erreur Framework produite pendant l'exécution du sous-programme défini par l'utilisateur ou l'agrégat « as frappé »:
  System.Exception: Cette fonctionnalité est désactivée dans le SQLCLR. Il est recommandé d'exécuter à partir de votre application client.   System.Exception:
  à Microsoft.SqlServer.Management.Common.ConnectionManager..ctor ()
  à Microsoft.SqlServer.Management.Smo.Server..ctor ()

Il n'y a pas moyen de contourner cela (bien, sauf si vous êtes Microsoft;).

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top