SQLServer:只有函數和某些擴展存儲過程才能從函數內部執行

今天寫了個函數,把表名作爲參數,然後通過Execute執行SQL來返回值。因爲表名是按照日期格式定義的。

SQL如下圖:

Create Function dbo.F_GetDepartFullName(
    @DepartID varchar(100),
    @DepTableName varchar(100)
) returns nvarchar(max)
as
begin
    declare @sql nvarchar(max)
    set @sql=''
    declare @fullname nvarchar(max)
    set @fullname=''
    
    set @sql =' with T as ( '
    set @sql+=Char(10)+Char(13)
    set @sql+='        select id,name,parentid from '+@DepTableName+' with(nolock) where id='+@DepartID
    set @sql+=Char(10)+Char(13)
    set @sql+='        union all '
    set @sql+=Char(10)+Char(13)
    set @sql+='        select dep.id,dep.name,dep.parentid from '+@DepTableName+' dep with(nolock) '
    set @sql+=Char(10)+Char(13)
    set @sql+='        inner join T on T.parentid=dep.id '
    set @sql+=Char(10)+Char(13)
    set @sql+='    ) '
    set @sql+=Char(10)+Char(13)
    set @sql+='    select @fullname=( '
    set @sql+=Char(10)+Char(13)
    set @sql+='        select ''-''+name from ( '
    set @sql+=Char(10)+Char(13)
    set @sql+='        select ROW_NUMBER() over(order by (select 0)) as RowID, * from T with(nolock) '
    set @sql+=Char(10)+Char(13)
    set @sql+='        ) T2 order by RowID desc for xml path('''') '
    set @sql+=Char(10)+Char(13)
    set @sql+='    ) '
    
    exec sp_executesql @sql,N'@fullname nvarchar(max) output',@fullname output
    set @fullname=case when isnull(@fullname,'')='' then '' else SUBSTRING(@fullname,2,len(@fullname)) end
    return @fullname
end

執行SQL的時候:

select xbb.dbo.F_GetDepartFullName('115462294','Depart20191012') 

出現下面錯誤提示:

消息 557,級別 16,狀態 2,第 95 行
只有函數和某些擴展存儲過程才能從函數內部執行。

 

一條一條的SQL刪除執行後,發現execute這句刪除後就可以正常執行。

百度到原因:函數只能使用簡單的sql語句,邏輯控制語句,複雜一點的存儲過程是不能調用的,在函數裏也不能使用execute  sp_executesql  或者execute

最後執行修改爲存儲過程或者通過代碼實現。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章