请教:字符串怎么被截断了...

deltime 2006-08-24 02:44:13
如下语句
DECLARE @STA NVARCHAR(20),@DIS NVARCHAR(20)
SET @STA = '半成品'
SET @DIS = '1报废'
SET @STA = ISNULL(CASE
WHEN @DIS = '报废' THEN '废品'
ELSE NULL END,@STA)
SELECT @DIS,@STA

运行的结果是:
1报废 半成

请教一下是怎么回事?有什么方法防止这种字符串截断?
...全文
451 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
deltime 2006-08-28
  • 打赏
  • 举报
回复
晕,不知道怎么样结贴了...
deltime 2006-08-28
  • 打赏
  • 举报
回复
OK
deltime 2006-08-28
  • 打赏
  • 举报
回复
OK
specialsoldier 2006-08-24
  • 打赏
  • 举报
回复
不好意思,少打了end,补上:
DECLARE @STA NVARCHAR(200),@DIS NVARCHAR(200),@temp nvarchar(200)
SET @STA = '半成品'
SET @DIS = '1报废'
SET @temp =(CASE
WHEN @DIS = '报废' THEN '废品' end)
set @sta = isnull(@temp,@STA)
SELECT @DIS,@STA
WUsuobuWEI 2006-08-24
  • 打赏
  • 举报
回复
ding
specialsoldier 2006-08-24
  • 打赏
  • 举报
回复
DECLARE @STA NVARCHAR(200),@DIS NVARCHAR(200),@temp nvarchar(200)
SET @STA = '半成品'
SET @DIS = '1报废'
SET @temp =(CASE
WHEN @DIS = '报废' THEN '废品'
set @sta = isnull(@temp,@STA)
SELECT @DIS,@STA

将你的那个可爱的逻辑分开来些,肯定没问题.因为分开后这样的写法无数人在用.不会出现意料之外的问题.但是可能连写在一块编译器会按照case语句中的信息给最后的结果套一个死的大小,所以导致字符串截断.另外这样的写法也不多见,完全用不找,确实可能出现问题.
specialsoldier 2006-08-24
  • 打赏
  • 举报
回复
DECLARE @STA NVARCHAR(200),@DIS NVARCHAR(200)
SET @STA = '半成品'
SET @DIS = '1报废'
SET @STA =isnull( CASE
WHEN @DIS = '报废' THEN '废品12'--then后面的值要占满3个字符的位置,就可以了.可能null也是有大小的?为了保证then和else生成的结果要等长?
ELSE null end,@STA)
SELECT @DIS,@STA

这个问题和当年的不用"a++"而用"a=a+1"一样,虽然逻辑上有点无用,但结果却出乎意料~
specialsoldier 2006-08-24
  • 打赏
  • 举报
回复
libin_ftsafe(子陌红尘...:
请解释下原因吧 我想知道...
playwarcraft 2006-08-24
  • 打赏
  • 举报
回复
--奇怪,怎麼不這樣寫?
DECLARE @STA NVARCHAR(20),@DIS NVARCHAR(20)
SET @STA = '半成品'
SET @DIS = '1報廢'

SET @STA = CASE WHEN @DIS = '報廢' THEN '廢品'
ELSE @STA END

SELECT @DIS,@STA
deltime 2006-08-24
  • 打赏
  • 举报
回复
DECLARE @STA NVARCHAR(200), --字符串变量的长度设置得更大一些
@DIS NVARCHAR(20)
SET @STA = '半成品'
SET @DIS = '1报废'
SET @STA = ISNULL(CASE
WHEN @DIS = '报废' THEN '废品11'--如果把'废品'这个常量设长一些就会可以,
ELSE NULL END,@STA)
specialsoldier 2006-08-24
  • 打赏
  • 举报
回复
更大我也试了 确实没有用的 你先用相同的逻辑实现了再说吧 原因我们慢慢想想
子陌红尘 2006-08-24
  • 打赏
  • 举报
回复
DECLARE @STA NVARCHAR(20),@DIS NVARCHAR(20)
SET @STA = '半成品'
SET @DIS = '1报废'
SET @STA= (CASE WHEN @DIS = '报废' THEN '废品' ELSE @STA END)
SELECT @DIS,@STA
子陌红尘 2006-08-24
  • 打赏
  • 举报
回复
看错了
specialsoldier 2006-08-24
  • 打赏
  • 举报
回复
DECLARE @STA NVARCHAR(200),@DIS NVARCHAR(200)
SET @STA = '半成品'
SET @DIS = '1报废'
SET @STA = CASE
WHEN @DIS = '报废' THEN '废品'
ELSE @STA end
SELECT @DIS,@STA

直接这样写就可以了嘛,出现这样的原因我想想,估计是编译器看不下去你的逻辑了...
deltime 2006-08-24
  • 打赏
  • 举报
回复
已经试过了,不行啊
子陌红尘 2006-08-24
  • 打赏
  • 举报
回复

DECLARE @STA NVARCHAR(200), --字符串变量的长度设置得更大一些
@DIS NVARCHAR(20)
SET @STA = '半成品'
SET @DIS = '1报废'
SET @STA = ISNULL(CASE
WHEN @DIS = '报废' THEN '废品'
ELSE NULL END,@STA)
SELECT @DIS,@STA

34,593

社区成员

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

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