IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('[dbo].[fn_parsing_makeupsql]') AND type = 'FN')
DROP FUNCTION [dbo].[fn_parsing_makeupsql]
GO
CREATE FUNCTION [dbo].[fn_parsing_makeupsql](@source varchar(max))
RETURNS varchar(8000)
AS
BEGIN

DECLARE @temp_data varchar(MAX) = @source

DECLARE @element_stack table(id int primary key identity(1,1),position int,item varchar(32))
DECLARE @data_calc table(name varchar(32),position int)

DECLARE @head varchar(32) = ''
DECLARE @head_index int = 0 
DECLARE @head_id int = 0 
DECLARE @index_count int = 0


DECLARE @item varchar(32)
DECLARE @item_index int

DECLARE @index int 

DECLARE @loopc int = 2

while 1=1
begin
--获取栈顶元素
select @head_id=id,@head=item,@head_index=position 
from @element_stack 
where id= (select MAX(id) from @element_stack)

--查找所有 ' , ( , ) 在字符串中的位置,并找出其中位置最靠前的压栈 要排除等于零这种
insert into @data_calc(name,position) values('''',CHARINDEX('''',@temp_data)),('(',CHARINDEX('(',@temp_data)),(')',CHARINDEX(')',@temp_data))
--如果所有符号的位置索引都为0,结束循环
if 0 = (select count(*) from @data_calc  where position!=0)
begin
break;
end
--否则求出其中索引最小且不为零的这种情况
select @item=name,@item_index=position from @data_calc 
where  position = (select min(position) from @data_calc where position!=0)
set @index_count+=@item_index
--清理数据
delete @data_calc
set @temp_data=SUBSTRING(@temp_data,@item_index+LEN(@item),LEN(@temp_data))
--如果栈顶元素是单引号,则直接跳过字符串中后续两两配对的单引号(因为这是字符串中的内容可以直接忽略)
if @head = '''' and @item='''' 
begin
set @index = CHARINDEX('''',@temp_data)
if @index = 1 --当前元素和下一元素都是单引号(单引号两两配对)
begin
set @temp_data=SUBSTRING(@temp_data,@index+1,LEN(@temp_data))
set @index_count+=1
continue
end
end
--判断符号栈栈顶元素

--如果栈顶元素为空
if @head is null or @head=''
begin
insert into @element_stack(position,item) values(@item_index,@item)
end else --如果栈顶元素不为空则处理当前元素和栈顶元素之间的关系
begin
--如果栈顶元素是单引号
if CHARINDEX('''',@head)>0 
begin
if (@head=@item)
delete from @element_stack where id = @head_id
end else if @head='('
begin
if @item=')' --如果 ( 遇到 )则出栈
delete from @element_stack where id = @head_id
else         --如果是其他标识符则无脑入栈
insert into @element_stack(item,position) values(@item,@item_index)
end
end

--select * from @element_stack
--select @temp_data

if (@temp_data='' or @temp_data=null or 0=(select count(*) from @element_stack)) break
end
RETURN SUBSTRING(@source,1,@index_count)
END