我是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新手,我确信我有一些非常简单的东西。
解
由于您无法从函数访问存储过程,因此我决定论证允许自动增量的情况。由于这是一次转换为内部数据库,设置表允许它,然后在数据传输后更改它似乎是处理它的最佳方式。
答案 0 :(得分:1)
您无法在函数中调用存储过程。
答案 1 :(得分:0)
尝试执行此功能
DECLARE @ret int
SET @ret = (SELECT dbo.GetNextID ('Client','iclientid',1))
PRINT @ret