CREATE FUNCTION fnTest
( )
RETURNS INTEGER
AS
BEGIN
INSERT INTO tmptable(c1,c2) select 2, 3
return 5
END很简单的一个测试函数,为什么不行呢?
用"INSERT INTO tmptable(c1,c2) values(2,3)"也是同样的错误,可是在查询分析器里是可以用的,难道在函数里不能这么用吗?
( )
RETURNS INTEGER
AS
BEGIN
INSERT INTO tmptable(c1,c2) select 2, 3
return 5
END很简单的一个测试函数,为什么不行呢?
用"INSERT INTO tmptable(c1,c2) values(2,3)"也是同样的错误,可是在查询分析器里是可以用的,难道在函数里不能这么用吗?
你可以定义一个表值函数,这里面可以更改要返回的表. 具体查一下mssql help.
if exists (select * from sysobjects where id = OBJECT_ID('[t]') and OBJECTPROPERTY(id, 'IsUserTable') = 1) DROP TABLE [t]
CREATE TABLE [t] ( [id] [int] NOT NULL , [T1] [nvarchar] (50) NULL , [T2] [nvarchar] (50) NULL ) INSERT [t] ( [id] , [T1] , [T2] ) VALUES ( 8 , 'A' , '001' )
INSERT [t] ( [id] , [T1] , [T2] ) VALUES ( 9 , 'D' , '001' )
INSERT [t] ( [id] , [T1] , [T2] ) VALUES ( 10 , 'F' , '001' )
INSERT [t] ( [id] , [T1] , [T2] ) VALUES ( 11 , 'D' , '002' )
INSERT [t] ( [id] , [T1] , [T2] ) VALUES ( 12 , 'F' , '002' )
INSERT [t] ( [id] , [T1] , [T2] ) VALUES ( 13 , 'F' , '003' )
--表值函数
DROP FUNCTION Temp_Tab
CREATE FUNCTION Temp_Tab(@Temp_T1 varchar(10))RETURNS Table
as
RETURN(
select * from T where T1=@Temp_T1
)
select * from dbo.Temp_Tab('F')
好像不行呀!
create table tb1(id int,name varchar(10))
insert into tb1 select 1,'a'
insert into tb1 select 2,'b'
insert into tb1 select 3,'aa'
insert into tb1 select 4,'bb'
create function fun_tb1(@name varchar(10))
returns table
as
return select * from tb1 where name like '%'+@name+'%'select * from dbo.fun_tb1('a')
/*
1 a
3 aa
*/
如何定义表值函数,就是简单得这样一个insert 操作,在function里怎么实现insert into table的功能呢?
限制相当多,用存储过程可以返回select * from table的集合,用其他程序可以访问到这个结果。
你的函数改一下可以运行:
CREATE FUNCTION fnTest
( )
RETURNS INTEGER
AS
BEGIN
declare @tmptable table(c1 int,c2 int)
INSERT INTO @tmptable(c1,c2) select 2, 3
return 5
END