如下语句
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报废  半成 请教一下是怎么回事?有什么方法防止这种字符串截断?

解决方案 »

  1.   


    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
      

  2.   

    DECLARE @STA NVARCHAR(200),@DIS NVARCHAR(200)
    SET @STA = '半成品'
    SET @DIS = '1报废'
    SET @STA = CASE  
                       WHEN @DIS = '报废' THEN '废品'
      ELSE @STA end
    SELECT @DIS,@STA直接这样写就可以了嘛,出现这样的原因我想想,估计是编译器看不下去你的逻辑了...
      

  3.   

    DECLARE @STA NVARCHAR(20),@DIS NVARCHAR(20)
    SET @STA = '半成品'
    SET @DIS = '1报废'
    SET @STA= (CASE WHEN @DIS = '报废' THEN '废品' ELSE @STA END)
    SELECT @DIS,@STA
      

  4.   

    DECLARE @STA NVARCHAR(200),  --字符串变量的长度设置得更大一些
            @DIS NVARCHAR(20)
    SET @STA = '半成品'
    SET @DIS = '1报废'
    SET @STA = ISNULL(CASE  
                       WHEN @DIS = '报废' THEN '废品11'--如果把'废品'这个常量设长一些就会可以,
      ELSE NULL END,@STA)
      

  5.   

    --奇怪,怎麼不這樣寫?
    DECLARE @STA NVARCHAR(20),@DIS NVARCHAR(20)
    SET @STA = '半成品'
    SET @DIS = '1報廢'SET @STA = CASE  WHEN @DIS = '報廢' THEN '廢品'
      ELSE @STA END   SELECT @DIS,@STA
      

  6.   

    libin_ftsafe(子陌红尘...:
    请解释下原因吧  我想知道...
      

  7.   

    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"一样,虽然逻辑上有点无用,但结果却出乎意料~
      

  8.   

    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语句中的信息给最后的结果套一个死的大小,所以导致字符串截断.另外这样的写法也不多见,完全用不找,确实可能出现问题.
      

  9.   

    不好意思,少打了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