2014-01-14 93 views
0

我是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)[email protected], cvalue = CONVERT(CHAR,(CONVERT(INT,cvalue)[email protected])) WHERE UPPER(ctablename) = UPPER(@tablename) AND UPPER(cfieldname) = UPPER(@fieldname) 
    SELECT @value 
    END 
ELSE 
    BEGIN 
    UPDATE id SET @value = CONVERT(INT,cvalue)[email protected], cvalue = CONVERT(CHAR,(CONVERT(INT,cvalue)[email protected])) 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 

我得到的錯誤:

Cannot find either column "dbo" or the user-defined function or aggregate "dbo.newid", or the name is ambiguous.

正如我所說的,我是SQL新手,我確信有一些非常簡單的東西,我錯過了。

SOLUTION

既然你無法從功能訪問一個存儲過程,我決定主張允許自動遞增的情況。由於這是一次轉換爲內部數據庫,建立表格以允許它,然後在數據傳輸後更改它似乎是處理它的最佳方式。

+0

它的一個函數,所以稱之爲'SELECT GetNextID('Client','iclientid',1)'執行... – user2989408

回答

1

不能調用函數存儲過程。

0

試試這個執行功能

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

使用'dbo.GetNextID' –

+0

不幸的是,這給了我同樣的錯誤。如果我刪除dbo,我會得到關於'GetNextID'的不同錯誤不是公認的內置函數名稱。 – Tim

+1

由於@Gatej建議將一個存儲的proc窗體調用一個函數是不合適的。你爲什麼不直接調用proc。你可以執行proc爲'DECLARE @id int; EXEC dbo.newid'Client','iclientid',1,@id OUTPUT'。然後選擇'@ id'。 – user2989408

相關問題