【发布时间】:2017-09-20 22:09:09
【问题描述】:
我有一个存储过程来更新几个聚合和一个函数 - 通过删除它们、程序集并重新导入它们。
我的代码:
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 中执行此操作?
【问题讨论】:
-
这是一个 copout,但是:你在动态 sql 中尝试过吗?
-
这不是一个骗局...动态 SQL 是您可以从存储过程中创建函数的唯一方式。
-
@DanielA.Thompson:这不是逃避——这是做这类事情的标准方式。在我看来,这是一件很奇怪的事情。但我支持另一种生活方式。
-
@DanielA.Thompson 你应该添加它作为答案——在这里工作——:-)
-
+1 对以上所有内容。我说这是一种逃避,因为我尽可能避免使用动态 sql :) 但正如你们所指出的,在这种情况下这是正确的解决方案。
标签: sql sql-server stored-procedures sql-server-2012 sql-function