Sqlserver怎么会有这个毛病啊?真恶心!

cngkqy 2007-12-03 10:20:08
declare @str varchar(300)
declare @int int

--Set @str = ''
--Set @int = ''

Print 'vvv' + @str + Cast(@int as Varchar)

上边这句话各位高手可以放到查询分析器里执行一下,按着常理,变量没有赋值,它应该输出字符vvv,但是执行后居然发现什么也没有输出。然后去掉两个为变量赋值语句的注释,发现才输出vvv0。这是什么毛病啊,真是恶心啊。有没有什么办法让不为变量赋值也能输出vvv啊?或是有其它的解决办法!恳请各位高手赐教!
...全文
175 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fa_ge 2007-12-03
  • 打赏
  • 举报
回复
那怎么样让@int用isnull转换后连0都没有了呢?或是用其它的办法replace替换下?






declare @str varchar(300)
declare @int int

select 'vvv' + isnull(@str,'') + case when @int is null then '' else cast(@int as varchar) end

/*

vvv

(所影响的行数为 1 行)
*/
cngkqy 2007-12-03
  • 打赏
  • 举报
回复
明白了,多谢各位高手给解惑啊!多谢~~~
xiaoku 2007-12-03
  • 打赏
  • 举报
回复
lz
你仔细分析一下 你上面两个@s的值再做比较好吗?不是相同的东西的。
fa_ge 2007-12-03
  • 打赏
  • 举报
回复
第一个是肯定没有结果的。因为@str+@str2=null,所有@s 也是null
第二个是有结果的,@str 是有初值的,所有@s也是有初值

所以"同样的Sql语句,居然一个输出命令已成功完成,一个输出表格。" 这是完全正确的
cngkqy 2007-12-03
  • 打赏
  • 举报
回复

declare @str varchar(300)
declare @str2 varchar(300)
declare @s varchar(1000)

Set @str = 'Select * From pubs.dbo.employee'
set @s=@str+@str2

exec (@s)




declare @str varchar(300)
declare @s varchar(1000)

Set @str = 'Select * From pubs.dbo.employee'
set @s=@str
exec (@s)




我崩溃了,这两段代码各位高手分别执行执行看输出,同样的Sql语句,居然一个输出命令已成功完成,一个输出表格。这都什么破毛病啊!
xiaoku 2007-12-03
  • 打赏
  • 举报
回复
那怎么样让@int用isnull转换后连0都没有了呢?或是用其它的办法replace替换下?

-------------
那你就不要用 @int 为int型的...改成varchar的。
xiaoku 2007-12-03
  • 打赏
  • 举报
回复
发表于:2007-12-03 10:39:318楼 得分:0

--请楼主来试试,这样有没有结果???

SQL code


declare @str varchar(300)
declare @str2 varchar(300)
declare @s varchar(1000)

Set @str = 'Select * From pubs.dbo.employee'
set @s=@str+@str2

exec (@s)



------------
肯定木有...的
xiaoku 2007-12-03
  • 打赏
  • 举报
回复
declare @str varchar(40)
declare @str2 varchar(20)

Set @str = 'Select * From pubs.dbo.employee'
--Set @str2 = null
select @str+ @str2 as a
exec (@str + @str2)

a
------------------------------------------------------------
NULL
emp_id fname minit lname job_id job_lvl pub_id hire_date
--------- -------------------- ----- ------------------------------ ------ ------- ------ ------------------------------------------------------
PMA42628M Paolo M Accorti 13 35 0877 1992-08-27 00:00:00.000
PSA89086M Pedro S Afonso 14 89 1389 1990-12-24 00:00:00.000

--吓我一跳,难道是exec 有自己的优化了吧...
--试试
exec null
-- 服务器: 消息 156,级别 15,状态 1,行 1
-- 在关键字 'null' 附近有语法错误。
--------------------------------------------
--不行。
--说明exec干掉了null
cngkqy 2007-12-03
  • 打赏
  • 举报
回复
那怎么样让@int用isnull转换后连0都没有了呢?或是用其它的办法replace替换下?
fa_ge 2007-12-03
  • 打赏
  • 举报
回复

--请楼主来试试,这样有没有结果???



declare @str varchar(300)
declare @str2 varchar(300)
declare @s varchar(1000)

Set @str = 'Select * From pubs.dbo.employee'
set @s=@str+@str2

exec (@s)
xiaoku 2007-12-03
  • 打赏
  • 举报
回复
declare @str varchar(300)
declare @int int

--Set @str = ''
--Set @int = ''

Print 'vvv' + isnull(@str,'') + Cast(isnull(@int,'') as Varchar)
----
vvv0

结果是这样让我有些吃惊。
为什么是vvv0 而不是vvv呢?
应该 isnull(@int,''),这里搞的鬼 isnull 之后,‘’变成了整型的了,而''的整型转成字符之后就成了0。看

declare @i int
select cast (isnull(@i ,'') as varchar) as v,isnull(@i ,'') as b
v b
------------------------------ -----------
0 0

(所影响的行数为 1 行)
现在不吃惊了,因为之前有了解过null是有类型的...
playwarcraft 2007-12-03
  • 打赏
  • 举报
回复
而且你的@int是int,
如果set @int=''
那其實@int是=0
cngkqy 2007-12-03
  • 打赏
  • 举报
回复
declare @str varchar(300)
declare @str2 varchar(300)

Set @str = 'Select * From pubs.dbo.employee'
--Set @str2 = null
exec (@str + @str2)

奇怪啊,既然null加任何东西都为null,那我这样执行后为何还能输出值呢?
fa_ge 2007-12-03
  • 打赏
  • 举报
回复

有没有什么办法让不为变量赋值也能输出vvv啊?


declare @str varchar(300)
declare @int int

print 'vvv' + isnull(@str,'') + Cast(isnull(@int,'') as Varchar)

--
vvv0
fa_ge 2007-12-03
  • 打赏
  • 举报
回复

declare @str varchar(300)
declare @int int

--Set @str = ''
--Set @int = ''

Print 'vvv' + @str + Cast(@int as Varchar)

-----------------

楼主是自己理解错了吧,当没有对变量给初值时,值 为null ,null+任何值=null
所以 print 出来结果是什么也没有,但把print 改为 select 时就会显示 null.
当对变量赋值时,结果当然是vvv0 了.




xiaoku 2007-12-03
  • 打赏
  • 举报
回复
按着常理,变量没有赋值,它应该输出字符vvv

sqlserver的常理是没有赋值的变量是null,而null加任何东西都为null...
yesyesyes 2007-12-03
  • 打赏
  • 举报
回复
不给变量赋值,就默认为null
null与其他值运算,都是null

22,302

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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