把表A字段A1的内容导到表B字段B1,通过userid关联.
A1为varchar(16),B1为varchar(10).
通过left(A1,10),如果这10位里有汉字,则left(A1,10)产生的宽度就>10,导表将失败.如果用left(A1,5)产生的宽度<=10,但这样丢失太多,很多时候字段放的都无汉字.
假如要写个leftofmine(A1,10),组合产生的宽度是10,应该怎么写,或者有什么别的办法么.表很多,规定不可更改为字段类型为nvarchar.

解决方案 »

  1.   

    首先你的类型是A1为varchar(16),B1为varchar(10)。那么也就是A1可以最多放8个汉字,B1放5个。
    B1永远只可以接受A1一半长度的数据。
      

  2.   

    用DataLength()
    select len('问题'),datalength('问题')分别返回2和4
    DATALENGTH 
    返回任何表达式所占用的字节数。
      

  3.   

    我上来了.
    目标表库是客户方面的,666个表,改一则禁止,二则太多.
    datalength()能知道长度,但现在是要拼接出尽可能的字,即合起来的要么10-1,要么10.
    难啊,库就2.6G了.
    如果自己写个自定义函数,需要逐字判断来拼接,即使写出来了,肯定速度太慢.
    希望大家再提些建设性意见.
      

  4.   

    我试试用上datalength()写个函数
      

  5.   

    --如果問題如LZ所說的話,似乎情況全寫出來也不是很多種情況
    --無非是left(B1,5) 到 left(B1,10) 六種情況而已
    --try:
    create table t1 (id int,name varchar(16))
    insert into t1 select 1,'1234567890123456'
    insert into t1 select 2,'臥室時的時間3213'
    insert into t1 select 3,'我怎12打43135643'
    insert into t1 select 4 ,'唉的安德14325678'
    insert into t1 select 5 ,'143'create table t2(id int,name varchar(10))
    insert into t2 (id) select 1 union select 2 union select 3 union select 4 union select 5update t2
     set name=case when datalength(left(t1.name,10))<=10 then left(t1.name,10)
                              else case when datalength(left(t1.name,9))<=10 then left(t1.name,9)
                                      else case when datalength(left(t1.name,8))<=10 then left(t1.name,8)
           else   case when datalength(left(t1.name,7))<=10 then left(t1.name,7)
                                                        else  case when datalength(left(t1.name,6))<=10 then left(t1.name,6)
                             else   left(t1.name,5) 
          end
                   end
         end
                    end
      end
    from t1
    where t1.id=t2.idselect * from t2drop table t1,t2/*
    id          name       
    ----------- ---------- 
    1           1234567890
    2           臥室時的時
    3           我怎12打43
    4           唉的安德14
    5           143
    */
      

  6.   

    用substring(cast(A1 as text),1,10)