给你个例子看看:CREATE PROCEDURE dbo.usp_getjobitembycopy1
@queryer varchar(50) = '',
@project int = 0,
@role varchar(20) = '',
@group varchar(20) = '',
@func varchar(20) = '',
@key varchar(100) = '',
@startdate varchar(10) = '01/01/1900',
@enddate varchar(10) = '12/31/9999',
@who varchar(50) = ''
AS
declare @sql nvarchar(2000)

declare @now datetime
select @now = getdate()

/*set @sql = 'select a.[id],a.[jitemid],a.[progress],dbo.func_getdate(a.[astartdate]) as astartdate, '
+ ' dbo.func_getdate(a.[aenddate]) as aenddate,a.[re],b.[empname],'
+ ' b.[itemname],dbo.func_getdate(b.[sstartdate]) as sstartdate,'
+ ' dbo.func_getdate(b.[senddate]) as senddate'
+ ' from [reportjobitemdetail] a'
+ ' left join [jobitem] b'
+ ' on a.[jitemid] = b.[id]'*/
set @sql = 'select distinct a.[jitemid]'
+ ' from [reportjobitemdetail] a'
+ ' left join [jobitem] b'
+ ' on a.[jitemid] = b.[id]'
set @sql = @sql + ' where 1 =1 '
set @sql = @sql + ' and a.[id] not in (select [id] from [weeklyreport] where [reporttype] = 0 and [reporter] = ''' + @queryer + ''')'
if @project != 0
begin
set @sql = @sql + ' and a.[jitemid] in ('
+ ' select [jitemid] from [jobitemproject] '
+ ' where [proid] = ''' + convert(varchar(10),@project) + ''')'
end
if @role ! = ''
begin
set @sql = @sql + ' and a.[jitemid] in('
+ ' select distinct jitemid '
+ ' from jobitemproject a '
+ ' left join projectresource b'
+ ' on a.proid = b.proid'
+ ' where prorole = ''' + replace(@role,'''','''''') + ''')'
end 
if @group != ''
begin
if @func != ''
begin
set @sql = @sql + ' and b.[empname] in (' + 
+ ' select [empname] from [employeefunction] where [group] = ''' 
+ replace(@group,'''','''''') + ''' and funcname =''' + replace(@func,'''','''''') + ''')'
end
else
begin
set @sql = @sql + ' and b.[empname] in (' + 
+ ' select [empname] from [employeefunction] where [group] = ''' + replace(@group,'''','''''') + ''')'
end
end
if @key != ''
begin
set @sql = @sql + ' and (b.[itemname] like ''%' + replace(@key,'''','''''') + '%'' or '
+ ' a.[re] like ''%' + replace(@key,'''','''''') + '%'')'
end
if @queryer != ''
begin
set @sql = @sql + ' and b.[empname] in ('
+ ' SELECT [name]' 
+ ' FROM dbo.func_getpermissionemployee('''
+ @queryer + ''',''' + convert(varchar(10),@now,101) + '''))'
end
if @who != ''
begin
set @sql = @sql + ' and b.[empname] = ''' + @who + ''''
end
set @sql = @sql + ' and datediff(day, ''' + @startdate + ''',b.[maintaindate]) >= 0 and datediff(day,b.[maintaindate], ''' + @enddate + ''') >= 0'

set @sql = @sql + ' and a.[jobflag] = 0'

set @sql = 'select [id],[status],[id] as jitemid,'
+ ' (select top 1 [id] from [reportjobitemdetail] '
+ ' where [jitemid] = a.[id] order by astartdate desc) as [wkid],'
+ ' (select top 1 [progress] from [reportjobitemdetail] '
+ ' where [jitemid] = a.[id] order by astartdate desc) as [progress],'
+ ' dbo.func_getdate((select top 1 [astartdate] from [reportjobitemdetail] '
+ ' where [jitemid] = a.[id] order by astartdate desc)) as astartdate, '
+ ' dbo.func_getdate((select top 1 [aenddate] from [reportjobitemdetail] '
+ ' where [jitemid] = a.[id] order by aenddate desc)) as aenddate,'
+ ' (select top 1 [re] from [reportjobitemdetail] '
+ ' where [jitemid] = a.[id] order by maintaindate desc) as [re],[empname],'
+ ' [itemname],dbo.func_getdate([sstartdate]) as sstartdate,'
+ ' dbo.func_getdate([senddate]) as senddate'
+ ' from jobitem a'
+ ' where id in ('
+ @sql + ') and a.status != 4'
set @sql = @sql + ' order by itemname asc,astartdate desc'
print @sql
select @sql
RETURN GO