今天寫了個函數,把表名作爲參數,然後通過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 。
最後執行修改爲存儲過程或者通過代碼實現。