以下自定义函数在语法检查时有下述错误。请教问题到底出在哪里?CREATE FUNCTION F_INCom(@code char(16))
RETURNS varchar(1000) AS
BEGIN
declare @_tempstr varchar(1000)
set @_tempstr = ''
select @_tempstr = @_tempstr + ',' + rtrim(T_bjyt.itemno)
from T_bjyt where T_bjyt.scode = @code
select @_tempstr = case
when @_tempstr <> '' then
left( @_tempstr, len(@_tempstr) - 1)
else
null
end
return (@_tempstr)
END错误提示
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: 'FUNCTION' 附近有语法错误。
服务器: 消息 137,级别 15,状态 1,行 8
必须声明变量 '@code'。
服务器: 消息 178,级别 15,状态 1,行 16
在此上下文中不能使用带有返回值的 RETURN 语句。我把SQL SERVER联机丛书中的示例在查询分析器测试,出现以下结果:CREATE FUNCTION ISOweek (@DATE datetime)
RETURNS int
AS
BEGIN
DECLARE @ISOweek int
SET @ISOweek= DATEPART(wk,@DATE)+1
-DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
--Special cases: Jan 1-3 may belong to the previous year
IF (@ISOweek=0)
SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1
AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
--Special case: Dec 29-31 may belong to the next year
IF ((DATEPART(mm,@DATE)=12) AND
((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
SET @ISOweek=1
RETURN(@ISOweek)
END
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: 'FUNCTION' 附近有语法错误。
服务器: 消息 137,级别 15,状态 1,行 6
必须声明变量 '@DATE'。
服务器: 消息 137,级别 15,状态 1,行 10
必须声明变量 '@DATE'。
服务器: 消息 137,级别 15,状态 1,行 13
必须声明变量 '@DATE'。
服务器: 消息 178,级别 15,状态 1,行 17
在此上下文中不能使用带有返回值的 RETURN 语句。我真不知道问题出在哪里了!求高手赐教
RETURNS varchar(1000) AS
BEGIN
declare @_tempstr varchar(1000)
set @_tempstr = ''
select @_tempstr = @_tempstr + ',' + rtrim(T_bjyt.itemno)
from T_bjyt where T_bjyt.scode = @code
select @_tempstr = case
when @_tempstr <> '' then
left( @_tempstr, len(@_tempstr) - 1)
else
null
end
return (@_tempstr)
END错误提示
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: 'FUNCTION' 附近有语法错误。
服务器: 消息 137,级别 15,状态 1,行 8
必须声明变量 '@code'。
服务器: 消息 178,级别 15,状态 1,行 16
在此上下文中不能使用带有返回值的 RETURN 语句。我把SQL SERVER联机丛书中的示例在查询分析器测试,出现以下结果:CREATE FUNCTION ISOweek (@DATE datetime)
RETURNS int
AS
BEGIN
DECLARE @ISOweek int
SET @ISOweek= DATEPART(wk,@DATE)+1
-DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
--Special cases: Jan 1-3 may belong to the previous year
IF (@ISOweek=0)
SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1
AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
--Special case: Dec 29-31 may belong to the next year
IF ((DATEPART(mm,@DATE)=12) AND
((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
SET @ISOweek=1
RETURN(@ISOweek)
END
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: 'FUNCTION' 附近有语法错误。
服务器: 消息 137,级别 15,状态 1,行 6
必须声明变量 '@DATE'。
服务器: 消息 137,级别 15,状态 1,行 10
必须声明变量 '@DATE'。
服务器: 消息 137,级别 15,状态 1,行 13
必须声明变量 '@DATE'。
服务器: 消息 178,级别 15,状态 1,行 17
在此上下文中不能使用带有返回值的 RETURN 语句。我真不知道问题出在哪里了!求高手赐教
不要括号
RETURN @ISOweek
CREATE FUNCTION ISOweek (@DATE datetime)
RETURNS int
AS
BEGIN
DECLARE @ISOweek int
SET @ISOweek= DATEPART(wk,@DATE)+1
-DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
--Special cases: Jan 1-3 may belong to the previous year
IF (@ISOweek=0)
SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1
AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
--Special case: Dec 29-31 may belong to the next year
IF ((DATEPART(mm,@DATE)=12) AND
((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
SET @ISOweek=1
RETURN(@ISOweek)
END
go
select dbo.isoweek(getdate())
go
drop function isoweek
/*-----------
2(1 行受影响)*/
--DROP TABLE T_bjyt
CREATE TABLE T_bjyt
(
scode CHAR(16),
itemno VARCHAR(100)
)
INSERT INTO T_bjyt
SELECT '0001', 'test1' UNION ALL
SELECT '0001', 'test2'
--------------------
ALTER FUNCTION F_INCom ( @code CHAR(16) )
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @_tempstr VARCHAR(1000)
SET @_tempstr = ''
SELECT @_tempstr = @_tempstr + ',' + RTRIM(T_bjyt.itemno)
FROM T_bjyt
WHERE T_bjyt.scode = @code
SELECT @_tempstr = CASE WHEN @_tempstr <> ''
--THEN LEFT(@_tempstr, LEN(@_tempstr) - 1)
THEN RIGHT(@_tempstr, LEN(@_tempstr) - 1)
ELSE NULL
END
RETURN (@_tempstr)
END
--test
SELECT test.dbo.F_INCom('0001')
在存储过程里定义一个变量,这个变量类型和函数里的变量类型一样,将函数里的变量值赋给新建的变量,在函数里面的语句里将所有的函数变量换成这个新建的变量,如:
CREATE FUNCTION ISOweek (@DATE datetime)
RETURNS int
AS
BEGIN
DECLARE @ISOweek int
DECLARE @DATA datetime -- 新建变量
SET @DATA = @DATE -- 将函数变量值给它,并将下边所有的@DATE换成@DATA
SET @ISOweek= DATEPART(wk,@DATE)+1
-DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
--Special cases: Jan 1-3 may belong to the previous year
IF (@ISOweek=0)
SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1
AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
--Special case: Dec 29-31 may belong to the next year
IF ((DATEPART(mm,@DATE)=12) AND
((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
SET @ISOweek=1
RETURN(@ISOweek)
END