我有一個客戶表PCUST,編號CT_NO結構為 nvarchar(20),由於在界面上有用一個文本框來輸入內容,且設置文本框的屬性MAXLENGTH=20,所以資料庫存入有以下內容:
CT_NO
----------
1234567890
我是客戶A002
TEST002
MAXNAMEA004這是一個P
-------------------
但後來由於版本升級原因,將該欄位結構修改為 nvarchar(10),現在我的問題是如何在SQL中用SQL語句查出內容長度大於10碼的記錄,正確應返回這兩條:
--------------------
我是客戶A002 -->這條內容長度現在為12
MAXNAMEA004這是一個P -->這條內容長度現在為20
-----------------
LEN()和DATALENGTH()都不對喲,望高手指點,萬分感激!!
CT_NO
----------
1234567890
我是客戶A002
TEST002
MAXNAMEA004這是一個P
-------------------
但後來由於版本升級原因,將該欄位結構修改為 nvarchar(10),現在我的問題是如何在SQL中用SQL語句查出內容長度大於10碼的記錄,正確應返回這兩條:
--------------------
我是客戶A002 -->這條內容長度現在為12
MAXNAMEA004這是一個P -->這條內容長度現在為20
-----------------
LEN()和DATALENGTH()都不對喲,望高手指點,萬分感激!!
declare @A table(CT_NO varchar(20))
insert into @A values('1234567890')
insert into @A values('我是客戶A002')
insert into @A values('TEST002')
insert into @A values('MAXNAMEA004這是一個P')select CT_NO,len(CT_NO) from @A-- where len(CT_NO)=11--返回
1234567890 10
我是客戶A002 8
TEST002 7
MAXNAMEA004這是一個P 16
debug.print LENB("我是客戶A002") '是16
USE TESTGO
CREATE FUNCTION StringLen(@Str varchar(20))
RETURNS int
AS
BEGIN
DECLARE @StringLen int
DECLARE @Len int
SET @StringLen=0
SET @Len=LEN(@Str)
WHILE @Len>0
BEGIN
SET @StringLen=@StringLen+1
SET @StringLen=@StringLen+PATINDEX('%[吖-咗]%',SUBSTRING(@Str,@Len,1))
SET @Len=@Len-1
END
RETURN(@StringLen)
ENDGO
CREATE TABLE customer(
cname varchar(20)
)
GO
INSERT INTO customer VALUES('1234567890')
INSERT INTO customer VALUES('我是客戶A002')
INSERT INTO customer VALUES('TEST002')
INSERT INTO customer VALUES('MAXNAMEA004這是一個P')
INSERT INTO customer VALUES('江苏省南京市')
INSERT INTO customer VALUES('TE中国南京')
INSERT INTO customer VALUES('TE1中国南京')
INSERT INTO customer VALUES('中国南京市')GO
SELECT cname FROM customer WHERE dbo.StringLen(cname)>10GO
DROP TABLE customer
DROP FUNCTION StringLenGO
DataLength 统计字节数,Unicode 字符的字节数都为 2。转换成 varchar 再计算
Len(Convert(varchar(20),CT_NO))
或
DataLength(Convert(varchar(20),CT_NO))
CREATE TABLE T(CT_NO nvarchar(20))
GOINSERT INTO T VALUES(N'1234567890')
INSERT INTO T VALUES(N'我是客戶A002')
INSERT INTO T VALUES(N'TEST002')
INSERT INTO T VALUES(N'MAXNAMEA004這是一個P')
GOSELECT CT_NO,
Len(CT_NO),DataLength(CT_NO),
Len(Convert(varchar(20),CT_NO)),
DataLength(Convert(varchar(20),CT_NO))
FROM T
--执行结果
1234567890 10 20 10 10
我是客戶A002 8 16 8 12
TEST002 7 14 7 7
MAXNAMEA004這是一個P 16 32 16 20