在函数调用存储过程中找不到用户定义的函数

时间:2014-01-14 18:03:36

标签: sql ssms sql-function

我是SQL的新手,所以我可能犯了一个非常简单的错误,并希望有人可以指出它是什么。

我有以下现有的存储过程生成一个新的主键(我知道有一种自动方法可以执行此操作,但我们希望自己处理生成):

ALTER   PROCEDURE [dbo].[newid] @tablename AS CHAR(10), @fieldname AS CHAR(15) = '', @ioffset AS INT, @theID as int = 0 output 
AS
BEGIN
 SET NOCOUNT ON

 DECLARE @value AS INT
 IF @ioffset < 1 SET @ioffset = 1
 IF LEN(@fieldname) > 0
  BEGIN
    UPDATE id SET @value = CONVERT(INT,cvalue)+@ioffset-1, cvalue = CONVERT(CHAR,(CONVERT(INT,cvalue)+@ioffset)) WHERE UPPER(ctablename) = UPPER(@tablename) AND UPPER(cfieldname) = UPPER(@fieldname)
   SELECT @value
  END
 ELSE
  BEGIN
   UPDATE id SET @value = CONVERT(INT,cvalue)+@ioffset-1, cvalue = CONVERT(CHAR,(CONVERT(INT,cvalue)+@ioffset)) WHERE UPPER(ctablename) = UPPER(@tablename)
   SELECT @value 
  End
 SET NOCOUNT OFF
set @theID = @value
END

我需要从select语句中调用它,所以我必须创建一个可以调用它的shell函数。我创建了以下标量值函数:

ALTER FUNCTION [dbo].[GetNextID]
(   
    @tablename AS CHAR(10),
    @fieldname AS CHAR(15) = '',
    @ioffset AS INT 
)
RETURNS int 
AS
    BEGIN 
        RETURN dbo.newid(@tablename, @fieldname, @ioffset)
    END

我现在正尝试使用以下方法对此进行测试:

DECLARE @ret int
EXEC @ret = dbo.GetNextID 'Client','iclientid',1
PRINT @ret

我收到错误:

  

找不到列“dbo”或用户定义的函数或聚合“dbo.newid”,或者名称不明确。

正如我所说的,我是SQL新手,我确信我有一些非常简单的东西。

由于您无法从函数访问存储过程,因此我决定论证允许自动增量的情况。由于这是一次转换为内部数据库,设置表允许它,然后在数据传输后更改它似乎是处理它的最佳方式。

2 个答案:

答案 0 :(得分:1)

您无法在函数中调用存储过程。

答案 1 :(得分:0)

尝试执行此功能

DECLARE @ret int
SET @ret = (SELECT dbo.GetNextID ('Client','iclientid',1))
PRINT @ret