唤醒调用返回表数据类型的用户定义函数
可唤醒调用返回表 (table) 的用户定义函数,其中在 SELECT、INSERT、UPDATE 或 DELETE 语句的 FROM 子句中允许表表达式。可在调用返回表的用户定义函数后加上可选的表别名。下例说明如何唤醒调用函数 fn_Products 和指派别名:SELECT OD.OrderID, OD.ProductID, fnPr.Price
FROM OrderDetails as OD, fn_Products('Discontinued') AS fnPr
WHERE OD.ProductID = fnPr.ProductID
ORDER BY OD.OrderID, OD.ProductID当在子查询的 FROM 子句中唤醒调用返回表的用户定义函数时,函数参数不能引用外部查询中的任何列。若 SELECT 语句的 FROM 子句引用了返回表的用户定义函数,则静态的只读游标是可在该 SELECT 语句上打开的唯一游标类型。引用返回表 (table) 的用户定义函数的 SELECT 语句唤醒调用该函数一次。

解决方案 »

  1.   

    如果你的函数是表值函数的话,不能出现在select的选择列表中
      

  2.   

    我的函数返回一个Table函数参数要从另一个表中去取

    coulumn1 coulun2 coumn3
    a           1     2
    b           1      3
    c           2      4
    把这个表中的,三列数据传递到我的表中的参数去select * from dbo.函数(参数1,参数2,参数3)函数返回的是一个表!!!!!
      

  3.   

    CREATE function 函数(@字段1 as varchar(20),@字段2 as int ,@字段3 int)
    returns @Time  table(列1  varchar(20),列2 datetime,列3 varchar(8000))
    as
    begin
    --一系列操作后,插入数据到@Time
    endselect dbo.函数('a',1,2,3) 返回正确结果
    现在我就是想把函数参数,换成一个表的变量来代替!!select dbo.函数(a.column1,a.coulmn2,coulmn3,a.column4) from 表 a就不行。请问怎么改?一定要改成标量函数吗??
      

  4.   

    这样的话可以用游标,不过性能很低if exists(select 1 from [tempdb]..[sysobjects] where id=object_id('[tempdb]..[#]'))
    drop table [tempdb]..[#]
    go
    create table #(列1  varchar(20),列2 datetime,列3 varchar(8000))
    declare cur cursor for select column1,column2,column3 from 表
    open cur
    declare @column1 varchar(20)
    declare @column2 varchar(20)
    declare @column3 varchar(20)
    fetch next from cur into @column1,@column2,@column3
    while @@fetch_status=0
    begin
         insert # select * from [dbo].函数(@column1,@column2,@column3)
         fetch next from cur into @column1,@column2,@column3
    end
    close cur
    deallocate curselect * from #
    drop table #