日期:2014-05-18  浏览次数:20471 次

存储过程中如何创建别库的自定义函数
我的做法当然是不行的

SQL code
USE LzmTWWorks
GO
CREATE PROCEDURE [dbo].[CreateLDateFunction]
     @Database nvarchar(50)
    ,@Namespace nvarchar(50)=N'dbo'
    ,@FunctionName nvarchar(50)
    ,@LDateTableNamespace nvarchar(50)=N'dbo'
    ,@LDateTable nvarchar(50)
AS
BEGIN
    DECLARE @SQL nvarchar(MAX)
    SELECT @SQL = [LzmTWWorks].[dbo].[GetCreateLdateFunctionStatement] (
       @Namespace
      ,@FunctionName 
      ,@LDateTableNamespace
      ,@LDateTable)
    SET @SQL = N'USE ' + @Database + ' ' + @SQL
    PRINT @SQL
    EXEC sp_executesql @SQL
END


调用:

SQL code
DECLARE    @return_value int

EXEC    @return_value = [LzmTWWorks].[dbo].[CreateLDateFunction]
        @Database = N'EmployeeWorks',
        @FunctionName = N'FunTest',
        @LDateTable = N'测试'

SELECT    'Return Value' = @return_value


显示结果:

SQL code
USE EmployeeWorks 
CREATE FUNCTION [dbo].[FunTest] 
(    
     @当前时间    [dbo].[LDate] = N'Current'
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT a.*
    FROM [dbo].[测试] a
    RIGHT OUTER JOIN
    (
        SELECT    [测试ID]
                ,MIN(DISTINCT [截止日期])AS 查询时间
        FROM [dbo].[测试]
        WHERE   @当前时间 BETWEEN [起始日期] AND [截止日期]
        GROUP BY [测试ID]
    ) b
    ON a.[测试ID]= b.[测试ID] AND a.截止日期 = b.查询时间
)
消息 111,级别 15,状态 1,第 2 行
'CREATE FUNCTION' 必须是查询批次中的第一个语句。
消息 137,级别 15,状态 2,第 17 行
必须声明标量变量 "@当前时间"。

(1 行受影响)



不知能否做得到?

------解决方案--------------------
SQL code
USE Employee
GO
CREATE FUNCTION ...


GO

------解决方案--------------------
USE EmployeeWorks 


go


CREATE FUNCTION [dbo].[FunTest]

....
------解决方案--------------------
CREATE FUNCTION [dbo].[FunTest] 
(
@当前时间 datetime
)
RETURNS TABLE 
AS
RETURN
------解决方案--------------------
SQL code
USE LzmTWWorks
GO
CREATE PROCEDURE [dbo].[CreateLDateFunction]
     @Database nvarchar(50)
    ,@Namespace nvarchar(50)=N'dbo'
    ,@FunctionName nvarchar(50)
    ,@LDateTableNamespace nvarchar(50)=N'dbo'
    ,@LDateTable nvarchar(50)
AS
BEGIN
    DECLARE @SQL nvarchar(MAX)
    SELECT @SQL = [LzmTWWorks].[dbo].[GetCreateLdateFunctionStatement] (
       @Namespace
      ,@FunctionName 
      ,@LDateTableNamespace
      ,@LDateTable)
    SET @SQL = N'USE ' + @Database + ' 
    go
    ' + @SQL
    PRINT @SQL
    EXEC sp_executesql @SQL
END

------解决方案--------------------
你能否简化一下问题,这个表结构都没有
------解决方案--------------------
我总算看明白你的意思了,没办法,人笨了点
----

exec()里面不能有go
'CREATE FUNCTION' 必须是查询批次中的第一个语句。
exec()结束之后sqlcontext仍然返回调用它的状态

---
所以,总的来说是没有办法
------解决方案--------------------
只要上面三条有一条能够解决掉,这个问题就了结了,估计很玄
------解决方案--------------------
此题无解.

------解决方案--------------------
搞不定
------解决方案--------------------
变通的方法.
每个库下建相应的存储过程执行当前库下CREATE FUNCTION 的操作.