注册 登录
编程论坛 SQL Server论坛

[求助]用户自定函数!!

豆芽的天空 发布于 2007-03-15 16:52, 1659 次点击

用户自定义函数:
谁帮我看一下这一段代码的错误:
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

ALTER function makeField(@FldName nvarchar(10),@FldType nvarchar(10),
@FldLen nvarchar(10), @FldDec nvarchar(10))
returns nvarchar(50) as begin
declare @result as nvarchar(50)
declare @FName nvarchar(10)
declare @FType nvarchar(10)
declare @FLen nvarchar(10)
declare @FDec nvarchar(10)
set @FName=ltrim(rtrim(isnull(@FldName,'')))
set @FType=ltrim(rtrim(isnull(@FldType,'')))
set @FLen =ltrim(rtrim(isnull(@FldLen,'')))
set @FDec =ltrim(rtrim(isnull(@FldDec,'')))
if @FName='' RAISERROR('字段名为空',16, 1)
if @FType='' RAISERROR ('字段'&@FldName&'类型为空',16, 1)
if @FType in ('varchar','char','nchar','nvarchar','decimal','numeric') and not isnumeric(@FLen) begin
RAISERROR ('字段'&@FName&'没有指定数据的长度',16, 1)
if cast(@FLen as int)<=0 RAISERROR ('数据' & @FName &'没有长度',16, 1)
end
if @FType in ('decimal','numeric') and not isnumeric(@FLen) begin
RAISERROR ('字段' & @FName &'没有指定小数位数',16, 1)
if cast(@FDec as int)<=0 RAISERROR ('字段' & @FName & '没有指定小数位数',16, 1)
end
set @result='['+isnull(@FName,'')+'] ' + isnull(@FType,'') + ' '
set @result=@result+
case
when isnull(@FType,'') in('varchar','char','nchar','nvarchar') then
'(' + isnull(@FLen,'') + ')'
when @FldType in('decimal','numeric') then
'(' + isnull(@FLen,'') + ',' + isnull(@FDec,'') + ')'
else
''
end
return @result + ',' + NCHAR(13)
End

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

18 回复
#2
豆芽的天空2007-03-15 17:02
哪个过来帮我看一下呀?我急要!!!!!
#3
cyyu_ryh2007-03-15 17:31
在查询分析器里没有提示错误吗?
#4
豆芽的天空2007-03-16 09:22
没有
就说begin附近有语法错误
#5
棉花糖ONE2007-03-16 10:16
错误一大堆,这个函数不是你写的吧,在sql中我没用过&amp;符号
#6
豆芽的天空2007-03-16 10:21

是我自己写的!!!!
我对SQL一点都不懂!!
但今天老总丢给我了
我只能硬着头皮去接!
哪位仁兄能帮小妹看看呀!

#7
棉花糖ONE2007-03-16 10:24
RAISERROR 不是这么用的,你去看看帮助吧
#8
豆芽的天空2007-03-16 10:29

那SQL中使用连字符不是跟别的语言一样的吗?

#9
棉花糖ONE2007-03-16 10:30
sql中的连字符是用+号
#10
豆芽的天空2007-03-16 10:33

“+”我也用了,但是还是提示有误!用“&”也提示发生错误!我已经完全没折了!

#11
豆芽的天空2007-03-16 10:35

可不可以帮我调一下呢?

#12
棉花糖ONE2007-03-16 11:00

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

ALTER function makeField(@FldName nvarchar(10),@FldType nvarchar(10),
@FldLen nvarchar(10), @FldDec nvarchar(10))
returns nvarchar(50) as
begin
declare @result as nvarchar(50)
declare @FName nvarchar(10)
declare @FType nvarchar(10)
declare @FLen nvarchar(10)
declare @FDec nvarchar(10)
declare @error nvarchar(20)
set @FName=ltrim(rtrim(isnull(@FldName,'')))
set @FType=ltrim(rtrim(isnull(@FldType,'')))
set @FLen =ltrim(rtrim(isnull(@FldLen,'')))
set @FDec =ltrim(rtrim(isnull(@FldDec,'')))
if @FName='' RAISERROR('字段名为空',16, 1)
if @FType=''
begin
select @error='字段'+@FldName+'类型为空'
RAISERROR (@error,16, 1)
end
if @FType in ('varchar','char','nchar','nvarchar','decimal','numeric') and isnumeric(@FLen)<>1
begin
select @error='字段'+@FName+'没有指定数据的长度'
RAISERROR (@error,16, 1)
if cast(@FLen as int)<=0
begin
select @error='数据'+@FName+'没有长度'
RAISERROR (@error,16, 1)
end
end
if @FType in ('decimal','numeric') and isnumeric(@FLen)<>1
begin
select @error='字段'+@FName+'没有指定小数位数'
RAISERROR (@error,16, 1)
end
if cast(@FDec as int)<=0
begin
select @error='字段'+ @FName+'没有指定小数位数'
RAISERROR (@error,16, 1)
end
set @result='['+isnull(@FName,'')+'] ' + isnull(@FType,'') + ' '
set @result=@result+
case
when isnull(@FType,'') in('varchar','char','nchar','nvarchar') then
'(' + isnull(@FLen,'') + ')'
when @FldType in('decimal','numeric') then
'(' + isnull(@FLen,'') + ',' + isnull(@FDec,'') + ')'
else
''
end
return @result +','+ NCHAR(13)
End

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

#13
豆芽的天空2007-03-16 11:09
谢谢!我再试试看!!!!
#14
豆芽的天空2007-03-16 11:28
不对哦!raiserror使用还是不对!
#15
棉花糖ONE2007-03-16 11:45

是不是函数中不能用raiserror啊,你直接输出不就好了

#16
新手菜鸟2007-03-16 13:39
去我那指教一下呀  棉花糖
#17
豆芽的天空2007-03-16 16:17

还是不对呀!!!!天哪!!!!明天老总出差回来问我拿我怎么办呀?

#18
棉花糖ONE2007-03-16 16:22

raiserror应该是不能在函数中用的,我自己写了个函数,用了raiserror也报错

#19
豆芽的天空2007-03-17 11:12

呵呵 原来不是raiserror不是不能用,只是我用错了。因为它是产生错误,而不能返加一个错误提示给它。我把它改为return就OK了。(QQ:115232615)

1