0

J'ai une procédure stockée qui met à jour plusieurs agrégats et une fonction - en les supprimant, en les assemblant et en les réimportant.Création d'une fonction dans une procédure stockée

Mon code:

CREATE PROCEDURE [maint].[UpdateSqlClr] 
AS 
    BEGIN 

    IF OBJECT_ID('dbo.[HistoricAnalysis]') IS NOT NULL 
    DROP FUNCTION [dbo].[HistoricAnalysis]; 
IF OBJECT_ID('dbo.[OverallStatus]') IS NOT NULL 
    DROP AGGREGATE [dbo].[OverallStatus]; 
IF OBJECT_ID('dbo.[OverallStatusBreakdown]') IS NOT NULL 
    DROP AGGREGATE [dbo].[OverallStatusBreakdown]; 
IF EXISTS 
(
    SELECT * 
    FROM sys.assemblies 
    WHERE [name] = 'SuperDbSqlCLR' 
) 
    DROP ASSEMBLY [SuperDbSqlCLR]; 

CREATE ASSEMBLY [SuperDbSqlCLR] FROM 'd:\Super\SuperDb.Sql.CLR\SuperDb.SqlClr.dll' WITH PERMISSION_SET = SAFE; 


CREATE AGGREGATE [dbo].[OverallStatus] 
(@input [NVARCHAR](4000) 
) 
RETURNS [NVARCHAR](4000) 
EXTERNAL NAME 
    SuperDbSqlCLR.[SuperDb.SqlClr.OverallStatus]; 
CREATE AGGREGATE [dbo].[OverallStatusBreakdown] 
(@input [NVARCHAR](4000) 
) 
RETURNS [NVARCHAR](4000) 
EXTERNAL NAME 
    [SuperDbSqlCLR].[SuperDb.SqlClr.OverallStatusBreakdown]; 

-- Where the GO would be in a query window 

CREATE FUNCTION [dbo].[HistoricAnalysis]() 
RETURNS TABLE (
    [Sequence] [int] NULL, 
    [Text] [nvarchar](100) NULL 
) 
AS 
EXTERNAL NAME [SuperDbSqlCLR].[SuperDb.SqlClr.UserDefinedFunctions].[HistoricAnalysis] 

    END 

Le problème est que si je peux ajouter un GO quand semblent juste courir le contenu de la procédure stockée dans une fenêtre de requête, créations SProc ne pas aimer la déclaration GO et à chaque fois, j'obtiens une erreur de syntaxe que 'CREATE FUNCTION' doit être la seule déclaration dans le lot -

Y at-il de toute façon à faire cela dans un SPROC?

+3

Ceci est un copout, mais: l'avez-vous essayé en SQL dynamique? –

+0

Ce n'est pas un copout ... Le SQL dynamique est la façon ** SEULEMENT ** de créer une fonction à partir d'une procédure stockée. –

+0

@ DanielA.Thompson: ce n'est pas un copout - c'est la manière standard de faire ce genre de chose. À mon avis, c'est une chose étrange à faire. Mais je soutiens les modes de vie alternatifs. –

Répondre

2

Cela devrait fonctionner en utilisant la commande exec, c'est-à-dire SQL dynamique.