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)"也是同样的错误,可是在查询分析器里是可以用的,难道在函数里不能这么用吗?

解决方案 »

  1.   

    标量函数中不能修改表,包括update,delete,insert.
    你可以定义一个表值函数,这里面可以更改要返回的表. 具体查一下mssql help.
      

  2.   

    函数中不能更改函数以外的对象,如对table的insert\delete\update;   
      

  3.   

    TO cuckoo1:如何定义一个表值函数呢?能否举个例子?谢谢!
      

  4.   


     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')
      

  5.   

    to scmail81 
    好像不行呀!
      

  6.   


    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')
      

  7.   


    /*
    1 a
    3 aa
    */
      

  8.   

    to cuckoo1 :
    如何定义表值函数,就是简单得这样一个insert 操作,在function里怎么实现insert into table的功能呢?
      

  9.   

    改过程怎么返回table呢?直接返回"select * from tablename"吗?
      

  10.   

    UDF中只能对Table变量进行操作,不准对数据库表和临时表操作,不准使用动态sql,不准调用存储过程
    限制相当多,用存储过程可以返回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