请教该函数哪里不对啊?

stephen_xl 2005-07-28 02:30:43
CREATE FUNCTION dbo.F_Pub_IfHaveColumn(
@TableName VARCHAR(50),
@ColumnName VARCHAR(50))
RETURNS INT
AS
BEGIN
DECLARE @s_Value VARCHAR(100),
@i_Value INT,
@sql NVARCHAR(500)

SET @s_Value=null
SET @sql=N'SELECT '+@s_Value+'=b.name FROM dbo.syscolumns a ,dbo.sysobjects b '+
N'WHERE a.id=b.id AND a.name= ' +char(39)+@ColumnName+char(39) +
N'AND b.name= ' +char(39)+@TableName+char(39)


GO

SET @i_Value=-1
If @@Error<>0
begin
If @s_Value is null
SET @i_Value=-1
else
SET @i_Value=0
end
else
RETURN -1

RETURN @i_Value


END


创建的时候报错
服务器: 消息 170,级别 15,状态 1,过程 F_Pub_IfHaveColumn,行 25
第 25 行: ')' 附近有语法错误。
服务器: 消息 137,级别 15,状态 1,行 3
必须声明变量 '@i_Value'。
服务器: 消息 137,级别 15,状态 1,行 5
必须声明变量 '@s_Value'。
服务器: 消息 137,级别 15,状态 1,行 7
必须声明变量 '@i_Value'。
服务器: 消息 137,级别 15,状态 1,行 9
必须声明变量 '@i_Value'。
服务器: 消息 178,级别 15,状态 1,行 13
在此上下文中不能使用带有返回值的 RETURN 语句。
服务器: 消息 137,级别 15,状态 1,行 13
必须声明变量 '@i_Value'。
...全文
106 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
paoluo 2005-07-28
  • 打赏
  • 举报
回复
和你刚才的调用是一样的。
stephen_xl 2005-07-28
  • 打赏
  • 举报
回复
还有,在存储过程中调用这个函数用什么方法啊?
paoluo 2005-07-28
  • 打赏
  • 举报
回复
你首先运行下

Select 1 from SysColumns Where Name='ufts' And ID=OBJECT_ID('CheckVouch')

看有没有结果。
paoluo 2005-07-28
  • 打赏
  • 举报
回复
晕倒,我的SQL有问题,自己看吧

--建立测试环境
Create Table TEST(
ID Int Identity,
subject Nvarchar(10),
keyword Nvarchar(100))
--插入数据
Insert Into TEST Values(N'信息主题1',N'电脑,电脑主机,联想电脑')
Insert Into TEST Values(N'信息主题2',N'电脑主机,联想电脑')
Insert Into TEST Values(N'信息主题3',N'显示器,三星显示器')
GO
--建立函数
CREATE Function dbo.F_Pub_IfHaveColumn(
@TableName VARCHAR(50),
@ColumnName VARCHAR(50))
Returns Int --0为不存在,1为存在
AS
BEGIN
Declare @Result Int
If Exists(Select 1 from SysColumns Where Name=@ColumnName And ID=OBJECT_ID(@TableName))
Set @Result=1
Else
Set @Result=0
Return @Result
END
GO
--测试
Select dbo.F_Pub_IfHaveColumn('TEST','subject')
GO
--删除测试环境
Drop Table TEST
Drop Function dbo.F_Pub_IfHaveColumn
GO
--结果
/*
1
*/
stephen_xl 2005-07-28
  • 打赏
  • 举报
回复
问题解决了
你的SQL有问题,我改成这样就可以了
elect 1 from dbo.SysColumns a,dbo.sysobjects b Where a.id=b.id and a.Name=@ColumnName And b.name=@TableName

结贴
rivery 2005-07-28
  • 打赏
  • 举报
回复
函数应该没有问题的。
你可以试试别的表。
paoluo 2005-07-28
  • 打赏
  • 举报
回复
应该不可能出现你所说的情况,我测试OK,才贴出来的,检查下你的字段名和表名有没有写错。

执行以下语句,看有没有结果

Select 1 from SysColumns Where Name='ufts' And ID=OBJECT_ID('CheckVouch')

也不会是动态语句的问题,因为没用到动态语句。
stephen_xl 2005-07-28
  • 打赏
  • 举报
回复
谢谢,但是调用结果不对
select dbo.F_Pub_IfHaveColumn('CheckVouch','ufts') 结果是0,应该是1才对。因为这个表有ufts字段的

是不是动态SQL的问题啊?应该怎么改?
phantomMan 2005-07-28
  • 打赏
  • 举报
回复
楼上是正确的
paoluo 2005-07-28
  • 打赏
  • 举报
回复

另外你的功能好像是判断某表是否函数某列吧,可以这么写。


CREATE Function dbo.F_Pub_IfHaveColumn(
@TableName VARCHAR(50),
@ColumnName VARCHAR(50))
Returns Int --0为不存在,1为存在
AS
BEGIN
Declare @Result Int
If Exists(Select 1 from SysColumns Where Name=@ColumnName And ID=OBJECT_ID(@TableName))
Set @Result=1
Else
Set @Result=0
Return @Result
END
GO
paoluo 2005-07-28
  • 打赏
  • 举报
回复
首先你那样写的代码是用存储过程来实现的,而不是函数。
stephen_xl 2005-07-28
  • 打赏
  • 举报
回复
那怎么办啊?我要写一个公共方法来返回结果,用存储过程可以返回吗,怎么调用?

问题解决后马上结贴给分
phantomMan 2005-07-28
  • 打赏
  • 举报
回复
函数里面无法使用 Execute(@SQL)

这是最简单的,但是不能执行,错误跟你上面的一样:

CREATE FUNCTION dbo.F_Pub_IfHaveColumn()
RETURNS INT
AS
BEGIN
exec('select 1')
RETURN 1
END
stephen_xl 2005-07-28
  • 打赏
  • 举报
回复
请指点,急~~~
stephen_xl 2005-07-28
  • 打赏
  • 举报
回复
CREATE FUNCTION dbo.F_Pub_IfHaveColumn(
@TableName VARCHAR(50),
@ColumnName VARCHAR(50))
RETURNS INT
AS
BEGIN
DECLARE @s_Value VARCHAR(100),
@i_Value INT,
@sql NVARCHAR(500)

SET @s_Value=null
SET @sql=N'SELECT '+@s_Value+'=b.name FROM dbo.syscolumns a ,dbo.sysobjects b '+
N'WHERE a.id=b.id AND a.name= ' +char(39)+@ColumnName+char(39) +
N'AND b.name= ' +char(39)+@TableName+char(39)


exec(@sql)--这里不是这样执行SQL吗?

SET @i_Value=-1
If @@Error<>0
begin
If @s_Value is null
SET @i_Value=-1
else
SET @i_Value=0
end
else
RETURN -1

RETURN @i_Value


END

服务器: 消息 443,级别 16,状态 2,过程 F_Pub_IfHaveColumn,行 28
在函数内不正确地使用了 'EXECUTE'。
phantomMan 2005-07-28
  • 打赏
  • 举报
回复
一个函数只能在一批中执行,你在其中加了 go ,这样函数的后部分就不包含在函数当中;
还有 这个@sql 也没有使用

CREATE FUNCTION dbo.F_Pub_IfHaveColumn(
@TableName VARCHAR(50),
@ColumnName VARCHAR(50)
)
RETURNS INT
AS
BEGIN
DECLARE @s_Value VARCHAR(100),
@i_Value INT,
@sql NVARCHAR(500)

SET @s_Value=null
SET @sql=N'SELECT '+@s_Value+'=b.name FROM dbo.syscolumns a ,dbo.sysobjects b '+
N'WHERE a.id=b.id AND a.name= ' +char(39)+@ColumnName+char(39) +
N'AND b.name= ' +char(39)+@TableName+char(39)
SET @i_Value=-1
If @@Error<>0
begin
If @s_Value is null
SET @i_Value=-1
else
SET @i_Value=0
end
else
RETURN -1
RETURN @i_Value
END
stephen_xl 2005-07-28
  • 打赏
  • 举报
回复
其中这个动态语句哪里不对啊?
SET @sql=N'SELECT b.name FROM dbo.syscolumns a ,dbo.sysobjects b '+
N'WHERE a.id=b.id AND a.name= ' +char(39)+@ColumnName+char(39) +
N'AND b.name= ' +char(39)+@TableName+char(39)

我print出来是这样的SELECT b.name FROM dbo.syscolumns a ,dbo.sysobjects b WHERE a.id=b.id AND a.name= 'ufts'AND b.name=
后面的没有了,为什么?
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: '=' 附近有语法错误。

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧