Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server截断变量,但在插入表时抛出错误_Sql_Sql Server - Fatal编程技术网

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

SQL 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

考虑一个表: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: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