在数据库的自定义函数中动态查询表

qqiuzaihui 2009-04-20 04:11:19
我想自定义一个名为 GETROWID 的自定义函数, 通过传入 [表名] 及 [列名] , 产生一个行ID号, 该行ID号不与
指定列中的值重复.

当我直接在该函数内部使用 PRINT 打印 @RowID 值, 结果正确的;
但在存储过程中调用该函数时, 提示的出错内容为: "只有函数和扩展存储过程才能从函数内部执行". 附上我的
代码, 请大家帮我解决一下. 谢谢.

附: 要想实现上面的功能, 有没有更好的办法呀. 请大家指点一二!


/**************************************************************************************************
** 功能:查询指定表的指定列, 产生一个行ID号, 该行ID号的值不与指定列中的值重复
** 输入:@TabName:表名, @ColumnName:列名
** 输出:行ID号
** 说明:调用方法:value = DBO.GETROWID('PatEmployee', 'PatEmpID')
**************************************************************************************************/
CREATE FUNCTION GETROWID(@TabName VARCHAR(50), @ColumnName VARCHAR(50))
RETURNS INTEGER
AS
BEGIN
DECLARE @Sql NVARCHAR(100)
DECLARE @RowID INTEGER
DECLARE @ID INTEGER
SET @RowID=1

__FINDLINEID:
BEGIN
SET @Sql = 'SELECT @ID=' +@ColumnName+ ' FROM ' +@TabName+ ' WHERE ' +@ColumnName+ '=' +RTRIM(@RowID)
EXEC sp_executesql @Sql, N'@ID INTEGER OUTPUT', @ID OUTPUT --只有函数和扩展存储过程才能从函数内部执行
IF(@ID IS NOT NULL)
BEGIN
SET @RowID = @RowID + 1
GOTO __FINDLINEID
END
RETURN @RowID -- 当调用该函数时, 提示出错:只有函数和扩展存储过程才能从函数内部执行
PRINT @RowID -- 打印 @RowID 值, 结果正确
END
END
...全文
205 7 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
qqiuzaihui 2009-04-22
好像还是不行, 我在想想其它办法吧. 谢谢, 分全给你了.
  • 打赏
  • 举报
回复
mynamelj 2009-04-20
在函数里不能执行动态SQL语句,你用存储过程试试
  • 打赏
  • 举报
回复
qqiuzaihui 2009-04-20
可能是我描述的不够准确, 我写这个函数的原因是因为: 我需要从另一个数据库中将我需要的一部分信息导入到我的数据库中(有多个表), 但因为对方数据库中没有我指定格式的行ID号, 所以我需要写一个实现这样功能的函数来得到我的行ID号.
我希望这所有的实现不借助开发平台, 而是借助于我写的一个存储过程来实现.
  • 打赏
  • 举报
回复
qqiuzaihui 2009-04-20
大哥你可能理解错了, 我说的这个自定义函数是 [SQL 2000] 中的 [用户定义的函数] , 这里面可以使用 ADO _ConnectionPtr 对象么?
  • 打赏
  • 举报
回复
mynamelj 2009-04-20
用ADO _ConnectionPtr对象

_ConnectionPtr->Execute("select ... from ... ", ...)
  • 打赏
  • 举报
回复
qqiuzaihui 2009-04-20
如何 "在外部直接执行你格式化好的一条SQL语句" , 麻烦你写一下具体操作的代码, 谢谢.
  • 打赏
  • 举报
回复
mynamelj 2009-04-20
在外部直接执行你格式化好的一条SQL语句不就好了,在存储过程中再调用EXEC显得有点多余
  • 打赏
  • 举报
回复
相关推荐
发帖
数据库

3975

社区成员

VC/MFC 数据库
社区管理员
  • 数据库
加入社区
帖子事件
创建了帖子
2009-04-20 04:11
社区公告
暂无公告