0

두 집계 및 함수를 업데이트하고 어셈블리를 삭제하고 어셈블리를 다시 가져 오는 저장 프로 시저가 있습니다.저장 프로 시저에서 함수 만들기

내 코드 :

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 

문제는, 난 그냥 쿼리 창에서 SPROC의 내용을 실행하는 GO를 추가 할 수있는 반면, SPROC의 작품은 GO 문을 좋아하지 않는 것이다와 때마다 'CREATE FUNCTION'이 일괄 처리의 유일한 문이어야한다는 구문 오류가 발생합니다.

SPROC에서이를 수행 할 수있는 방법이 있습니까?

+3

이것은 copout이지만 : 동적 SQL에서 사용해 보셨습니까? –

+0

그것은 copout이 아닙니다 ... 동적 SQL은 저장 프로 시저 내에서 함수를 만들 수있는 ** 유일한 ** 방법입니다. –

+0

@ DanielA.Thompson : 그것은 논쟁이 아닙니다. 그것은 이런 종류의 일을하는 표준 방법입니다. 제 의견으로는 이상한 일입니다. 하지만 대체 생활 방식을지지합니다. –

답변

2

exec 명령 (동적 SQL)을 사용해야합니다.