SQL Server截断变量,但在插入表时抛出错误
考虑一个表:dummySQL Server截断变量,但在插入表时抛出错误,sql,sql-server,Sql,Sql Server,考虑一个表:dummy 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:dail
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;
现在select输出是:(注意输出被截断以适合变量@txt)
所以我的问题是,为什么变量值被截断,而不是表插入
这可能是一个问题,因为任何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
如果您可以查看表dummy_realdata,问题很简单。名称大小为2048。反之亦然,即插入dummy,然后插入dummy\u 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
不令人满意的答案是这样做:“当字符表达式转换为不同大小的字符数据类型时,对于新数据类型来说太长的值会被截断”是的,我阅读了文档。但这不是很容易出错吗?因为我确实面临着数据丢失的问题。我同意应该更正SP和表,但不一致的行为仍然令人讨厌。我的问题是,为什么变量的数据会被截断,而插入时却不会。假设我不能更改表的DDL。因为我在没有引发异常的情况下遇到了这个问题,并且我发现在Table2Dude中,您的dummy_realdata是nvarchar(2048),@txt是nvarchar(200),dummy是nvarchar(200)。但您正在插入长度为250的字符串。尝试直接在虚拟表中插入字符串,您将再次面临相同的截断错误。这里不是变量或表格,而是数据类型的大小。为了更清楚,请将dummy_realdata的大小减少到200,并检查此表中是否也可以看到相同的截断。请注意,SQL server不会为此类截断抛出错误。不,我已经尝试直接插入到Dummy中,但它抛出了错误,但没有截断,这是我提到的问题。是的,您是对的,但变量会截断名称,然后插入。
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