在数据库代码开发过程,会有时遇到将一个nvarchar的字段(或者即含有双字节字符,又包含单字节字符的字段)赋值给一个varchar的字段。这时如果varchar字段不是足够长,比如:nvarchar字段和varchar字段都是100个长度,我们在使用nvarchar字段给varchar赋值的时候,会报字符串被截断的错误(即:将截断字符串或二进制数据。),所以有必要写一个函数来保证不使得插入的字符超出varchar字段的最大长度。
代码如下:
CREATE FUNCTION UDF_GetSelByteLenString(
@SelByteLen INT,
@DblByteString NVARCHAR(2000)
)
RETURNS VARCHAR(4000)
AS
BEGIN
--nvarchar to varchar,double byte to sigle byte
DECLARE @SelLen INT
--DECLARE @DblByteString NVARCHAR(2000)
SET @SelLen=@SelByteLen
--SET @DblByteString='0123456789一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十'
DECLARE @DblByteCharLooper INT
,@tmpDblByteString VARCHAR(2000)
SET @DblByteCharLooper=1
WHILE @DblByteCharLooper<=LEN(@DblByteString)
BEGIN
SELECT @tmpDblByteString=SUBSTRING(@DblByteString,1,@DblByteCharLooper)
IF DATALENGTH(@tmpDblByteString)>@SelLen
BEGIN
SET @tmpDblByteString=SUBSTRING(@DblByteString,1,@DblByteCharLooper-1)
BREAK
END
--
SET @DblByteCharLooper=@DblByteCharLooper+1
END
--SELECT @tmpDblByteString
RETURN @tmpDblByteString
END
可以使用下面的语句测试上面的函数:
--针对这个场景需要有一个可以方便获取尽量多字符的函数,还要保证不发生字符串截断错误
--场景2:插入表格
--这个会报错
DECLARE @tmpTable TABLE (
T VARCHAR(50)
)
INSERT INTO @tmpTable
(
T
)
SELECT '一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十'
SELECT
tt.T
FROM
@tmpTable AS tt
--使用下面函数后,将不会再报错,但是函数返回值,会将原字符串截断到指定长度
DECLARE @tmpTable TABLE (
T VARCHAR(50)
)
INSERT INTO @tmpTable
(
T
)
SELECT SystemDB.dbo.UDF_GetSelByteLenString(50, '一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十')
SELECT
tt.T
FROM
@tmpTable AS tt