关于临时表的表链接

colacoca 2005-08-31 11:44:31
我建立一个存储过程,用来显示查询结果.在过程中用了几个临时表.
如下:(其中a表中有res等数列,b表有id 和name2列)
ALTER PROCEDURE [dbo].[sss]
@res varchar(10) = '' --指返回码

AS
declare @sql varchar(2000)
select @sql='select * into #t1 from table1 where 1=1 '
(具体条件略)
if @res= '' select @res= '%'
select * into #t2 from app_dic_onlierrmsg where id like @a

set @sql =@sql+ 'SELECT b.name 返回
from #t1 a,#t2 b where a.res = b.id
print @sql
exec (@sql)

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

--------------------在上述状态下,是可以返回结果的.
这里只有当a.res = b.id时,才有 b.name 返回. 现在有出现一种情况就是,a.res <> b.id,也就是a表中的res不能在b中找到id时,就不能在结果中反映出来b.name.也就是会有漏掉的记录.


ALTER PROCEDURE [dbo].[sss]
@res varchar(10) = '' --指返回码

AS
declare @sql varchar(2000)
select @sql='select * into #t1 from table1 where 1=1 '
(具体条件略)
if @res= '' select @res= '%'
select * into #t2 from app_dic_onlierrmsg where id like @a


--添加一行,想法是若#t1.res = #t2.id时,替换#t1.res = #t2.name 此时res显示为name,否则Res显示id
update #t1 set #t1.res = #t2.name where #t1.res = #t2.id
(错误提示为 服务器: 消息 107,级别 16,状态 3,行 2
列前缀 '#t2'与查询中所用的表名或别名不匹配。)

--换为另一种方式
update a set a.res = b.name from #t1 a,#t2,b where a.res = b.id
(错误提示为 服务器: 消息 8152,级别 16,状态 9,行 2
将截断字符串或二进制数据。
语句已终止。)


set @sql =@sql+ 'SELECT a.res 返回
from #t1 print @sql
exec (@sql)

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
------------------出错原因我想是和临时表有关,现在很苦恼,想不出办法了,希望大家能指点我下.这个这两天就要改好了,谢谢.
...全文
150 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2005-08-31
  • 打赏
  • 举报
回复
--下面是几种连接的简单示例, 看看对楼主理解这些问题的原因有好处理(其实不是问题,是楼主理解的问题).

--测试数据
DECLARE @a TABLE(id int)
INSERT @a SELECT 1
UNION ALL SELECT 2

DECLARE @b TABLE(id int)
INSERT @b SELECT 2
UNION ALL SELECT 3

--内联接
SELECT * FROM @a a JOIN @b b ON a.id=b.id
SELECT * FROM @a a,@b b WHERE a.id=b.id
/*--结果(只返回两个表中id相同的记录)
id id
----------- -----------
2 2
--*/

--左向外联接
SELECT * FROM @a a LEFT JOIN @b b ON a.id=b.id
SELECT * FROM @a a,@b b WHERE a.id*=b.id --会产生不明确查询,不建议再使用这种方式
/*--结果(返回@a(左边表)所有的记录,及@b(右边表)的id与@a表id匹配的记录),不匹配的用NULL表示
id id
----------- -----------
1 NULL
2 2
--*/

--右向外联接
SELECT * FROM @a a RIGHT JOIN @b b ON a.id=b.id
SELECT * FROM @a a,@b b WHERE a.id=*b.id --会产生不明确查询,不建议再使用这种方式
/*--结果(返回@b(右边表)所有的记录,及@a(左边表)的id与@b表id匹配的记录),不匹配的用NULL表示
id id
----------- -----------
2 2
NULL 3
--*/

--完整外部联接
SELECT * FROM @a a FULL JOIN @b b ON a.id=b.id
/*--结果(返回@a与@b表所有的记录,id不匹配的用NULL表示
id id
----------- -----------
2 2
NULL 3
1 NULL
--*/

--交叉联接
SELECT * FROM @a a CROSS JOIN @b b
SELECT * FROM @a a,@b b
/*--结果:
id id
----------- -----------
1 2
2 2
1 3
2 3
--*/
zjcxc 元老 2005-08-31
  • 打赏
  • 举报
回复
where 相当于 inner join ,即内连接.

建议楼主看看联接方面的资料
wgsasd311 2005-08-31
  • 打赏
  • 举报
回复
这里只有当a.res = b.id时,才有 b.name 返回. 现在有出现一种情况就是,a.res <> b.id,也就是a表中的res不能在b中找到id时,就不能在结果中反映出来b.name.也就是会有漏掉的记录.
----------这是因为你用了where条件导致的,改为右连接即可
SELECT b.name 返回 from #t1 a,#t2 b where a.res = b.id=====>
SELECT b.name 返回 from #t1 a right join #t2 b on a.res=b.id
wgsasd311 2005-08-31
  • 打赏
  • 举报
回复
update a set a.res = b.name from #t1 a,#t2,b where a.res = b.id
(错误提示为 服务器: 消息 8152,级别 16,状态 9,行 2
将截断字符串或二进制数据。
语句已终止。)
--------------和临时表没关系,是字段长度不一致导致的,也就是说,res字段长度小于name字段长度。
rivery 2005-08-31
  • 打赏
  • 举报
回复
update #t1 set #t1.res = #t2.name where #t1.res = #t2.id
(错误提示为 服务器: 消息 107,级别 16,状态 3,行 2
列前缀 '#t2'与查询中所用的表名或别名不匹配。)
---->
update #t1 set #t1.res = #t2.name from #t2 where #t1.res = #t2.id
子陌红尘 2005-08-31
  • 打赏
  • 举报
回复
'SELECT b.name from #t1 a,#t2 b where a.res = b.id'

==>

'SELECT b.name from #t1 a right join #t2 b on a.res = b.id'
vivianfdlpw 2005-08-31
  • 打赏
  • 举报
回复
SELECT b.name 返回 from #t1 a,#t2 b where a.res = b.id

==========>

SELECT b.name 返回
from #t1 a
right join #t2 b on a.res = b.id
colacoca 2005-08-31
  • 打赏
  • 举报
回复
我的QQ260771 MSN ly3523431@hotmail.com 大家方便的可以加一下么?有问题可以直接请教了.谢谢.请注明CSDN
colacoca 2005-08-31
  • 打赏
  • 举报
回复
'SELECT b.name from #t1 a,#t2 b where a.res = b.id'

==>

'SELECT b.name from #t1 a right join #t2 b on a.res = b.id'
--------------------
这里之前简化了写法,本来是
'SELECT a.a,a.b,a.c,c.a,c.b,d.a b.name from #t1 a,#t2 b,#t3 c,#t4 d where 各条件'

改动后, from #t1 a right join #t2 b on a.res = b.id' 这个顺序应该怎么改呢?

--试改成from #t1 a right join #t2 b on a.res = b.id #t3 c,#t4 d where 各条件'

服务器: 消息 170,级别 15,状态 1,行 2
第 2 行: 'john' 附近有语法错误。

--试改成from #t2 b, #t3 c,#t4 d ,#t1 a right join b on a.res = b.id where 各条件'

服务器: 消息 170,级别 15,状态 1,行 2
第 2 行: 'a' 附近有语法错误。


colacoca 2005-08-31
  • 打赏
  • 举报
回复
谢谢这么多好心人.我慢慢研究下.

每次到这里都觉得很温暖.
danisluo 2005-08-31
  • 打赏
  • 举报
回复
up,又学了一招!

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧