SQL Server截断变量,但在插入表时抛出错误

时间:2014-09-19 06:22:48

标签: sql sql-server

考虑一个表:虚拟

DROP TABLE dummy;
CREATE TABLE dummy( name nvarchar( 200 ));

尝试插入大于200 nvarchar长度的数据(即400个1字节字符)。它抛出错误:(好)

  

字符串或二进制数据将被截断。声明一直如此   终止。

现在尝试对变量做类似的事情。

declare @txt nvarchar(200) = 'period:daily?h=2&m=5|period:daily?h=1&m=14|period:daily?h=1&m=16|period:daily?h=1&m=23|period:daily?h=1&m=37|period:daily?h=1&m=17|period:daily?h=1&m=9|period:daily?h=1&m=25|period:daily?h=1&m=28|period:daily?h=1&m=0|period:daily?h=1&m=2|period:daily?h=1&m=52';
select @txt;

现在选择输出是:(观察输出被截断以适应变量@txt)

period:daily?h=2&m=5|period:daily?h=1&m=14|period:daily?h=1&m=16|period:daily?h=1&m=23|period:daily?h=1&m=37|period:daily?h=1&m=17|period:daily?h=1&m=9|period:daily?h=1&m=25|period:daily?h=1&m=28|peri

所以我的问题是,为什么变量值被截断而不是表插入?

这可能是一个问题,因为任何SP使用变量来存储表T1 Column1中的值并在某些检查后插入T2 column1将部分地松散T1 Column1中存在的数据。

在这两种情况下,处理较大长度数据的逻辑是否应该保持一致?

示例:

DROP TABLE dummy;
CREATE TABLE dummy( name nvarchar( 200 ));

DROP TABLE dummy_realdata;
CREATE TABLE dummy_realdata( name nvarchar( 2048 ));

INSERT INTO dummy_realdata
VALUES( 'period:daily?h=2&m=5|period:daily?h=1&m=14|period:daily?h=1&m=16|period:daily?h=1&m=23|period:daily?h=1&m=37|period:daily?h=1&m=17|period:daily?h=1&m=9|period:daily?h=1&m=25|period:daily?h=1&m=28|period:daily?h=1&m=0|period:daily?h=1&m=2|period:daily?h=1&m=52' );

declare @txt nvarchar(200);
select @txt = name from dummy_realdata ;
insert into dummy values( @txt);
select * from dummy ; -- truncated. hence lose of data!
select * from dummy_realdata ; -- Real data

1 个答案:

答案 0 :(得分:0)

如果您可以查看表dummy_realdata.name大小是2048,问题很简单。反之亦然,即插入到dummy,然后dummy_realdata,您将面临同样的问题。因为插入名称的长度大约是258.但是您要求只存储200个。

试试这个摆脱

DROP TABLE dummy;
CREATE TABLE dummy( name nvarchar( 2048 ));

DROP TABLE dummy_realdata;
CREATE TABLE dummy_realdata( name nvarchar( 2048 ));

INSERT INTO dummy_realdata
VALUES( 'period:daily?h=2&m=5|period:daily?h=1&m=14|period:daily?h=1&m=16|period:daily?h=1&m=23|period:daily?h=1&m=37|period:daily?h=1&m=17|period:daily?h=1&m=9|period:daily?h=1&m=25|period:daily?h=1&m=28|period:daily?h=1&m=0|period:daily?h=1&m=2|period:daily?h=1&m=52' );

declare @txt nvarchar(2048);
select @txt = name from dummy_realdata ;
insert into dummy values( @txt);
select * from dummy ; -- truncated. hence lose of data!
select * from dummy_realdata ; -- Real data