REATE PROCEDURE YX_GetTLiuYanFaTiebyPage
@columnId bigint,
@pageSize int,
@pageIndex int,
@strWhere nvarchar(1000)
As
if(@columnId = 0)
begin
select contentId,Title, case IsAnswered when 0 then '待解决' else '已解决' end as IsAnswered,
b.realName as author,
c.realName as lasteditor,
LastTime
into #TmpFaTieA
from TLiuYanFaTie a,TUser b,TUser c
where a.author =b.userId
and a.lastEditor = c.userId
and @strWhere -----问题老是出现在这,删了这句就没事,这能这么写吗?
order by LastTime descexec YX_GetRecordByPage '#TmpFaTieA','lastTime',@pageSize,@pageIndex,0,1,'1=1'
@columnId bigint,
@pageSize int,
@pageIndex int,
@strWhere nvarchar(1000)
As
if(@columnId = 0)
begin
select contentId,Title, case IsAnswered when 0 then '待解决' else '已解决' end as IsAnswered,
b.realName as author,
c.realName as lasteditor,
LastTime
into #TmpFaTieA
from TLiuYanFaTie a,TUser b,TUser c
where a.author =b.userId
and a.lastEditor = c.userId
and @strWhere -----问题老是出现在这,删了这句就没事,这能这么写吗?
order by LastTime descexec YX_GetRecordByPage '#TmpFaTieA','lastTime',@pageSize,@pageIndex,0,1,'1=1'
1 :普通SQL语句可以用Exec执行 eg: Select * from tableName
Exec('select * from tableName')
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL eg:
declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。
Exec('select ' + @fname + ' from tableName') -- 请注意 加号前后的 单引号的边上加空格 当然将字符串改成变量的形式也可
declare @fname varchar(20)
set @fname = 'FiledName' --设置字段名 declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句会报错 declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句正确 3. 输出参数
declare @num int,
@sqls nvarchar(4000)
set @sqls='select count(*) from tableName'
exec(@sqls)
--如何将exec执行结果放入变量中? declare @num int,
@sqls nvarchar(4000)
set @sqls='select @a=count(*) from tableName '
exec sp_executesql @sqls,N'@a int output',@num output
select @num
exec('select contentId,Title, case IsAnswered when 0 then ''待解决'' else ''已解决'' end as IsAnswered,
b.realName as author,
c.realName as lasteditor,
LastTime
into #TmpFaTieA
from TLiuYanFaTie a,TUser b,TUser c
where a.author =b.userId
and a.lastEditor = c.userId
and '+@strWhere + ' order by LastTime desc '
要么将临时表改为全局临时表。或者将后面访问临时表的sql语句也都放进动态SQL里面。如:exec('select contentId,Title, case IsAnswered when 0 then ''待解决'' else ''已解决'' end as IsAnswered,
b.realName as author,
c.realName as lasteditor,
LastTime
into ##TmpFaTieA
from TLiuYanFaTie a,TUser b,TUser c
where a.author =b.userId
and a.lastEditor = c.userId
and '+@strWhere + ' order by LastTime desc '
select * from ##TmpFaTieA --或者:
exec('select contentId,Title, case IsAnswered when 0 then ''待解决'' else ''已解决'' end as IsAnswered,
b.realName as author,
c.realName as lasteditor,
LastTime
into #TmpFaTieA
from TLiuYanFaTie a,TUser b,TUser c
where a.author =b.userId
and a.lastEditor = c.userId
and '+@strWhere + ' order by LastTime desc ;select * from #TmpFaTieA'
本地临时表在当前会话结束时自动除去,一般就是存储过程执行完了,它就自动销毁;
全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。任务与表之间的关联只在单个 Transact-SQL 语句的生存周期内保持。
换言之,当创建全局临时表的会话结束时,最后一条引用此表的 Transact-SQL 语句完成后,将自动除去此表.