今天无意中发现sql语句中分号的好处
在写一个存储过程的时候,要将查询的语句放到一个临时表中去,需要使用到select * into #p功能,sql的写法如下:
declare @strSql varchar(4000)
declare @wheresql varchar(4000)
set @wheresql=****
set @strSql=Nselect top 100 * into #p from news where 1=1@wheresql order by news_id desc
EXEC(@strSql)
select * from #p (这里提示#p不存在)
原因:#p属于局部临时表,局部临时表只在当前会话中有效,所以上面提示#p不存在
解决的方法有两种
1、在sql语句前面使用create创建临时表#p,然后使用inset into #p execute(@strSql)把上面的sql语句执行效果插入到#p中(注意要去掉上面语句中的into #p两个词语),功能和上面一样。
2、还继续使用上面的sql语句,把select * from #p也放到那个sql语句之中。这里就需要使用分号了。分号在sql语句中的意义是,一行的结束,即使一行sql语句之间使用分号了两个sql语句,同两行sql语句是一样的。
上面的存储过程的改成
declare @strSql varchar(4000)
declare @wheresql varchar(4000)
set @wheresql=****
set @strSql=Nselect top 100 * into #p from news where 1=1@wheresql order by news_id desc;select * frorm #p
EXEC(@strSql)
这样就没有问题了
这样也解决了select into 与临时表之间的问题了