考虑一个表:虚拟
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
答案 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