字符串或二进制数据将被截断。该语句已终止

时间:2013-02-22 07:57:50

标签: sql sql-server

我遇到了SQL服务器的一些问题,这是我创建的函数:

ALTER FUNCTION [dbo].[testing1](@price int)
RETURNS @trackingItems1 TABLE (
   item       nvarchar  NULL,
   warehouse   nvarchar NULL,
   price int   NULL
) 
AS
BEGIN
   INSERT INTO @trackingItems1(item, warehouse, price)
   SELECT ta.item, ta.warehouse, ta.price 
   FROM   stock ta
   WHERE  ta.price >= @price; 

   RETURN;
END;

当我编写查询以使用该函数时,如下所示,它会收到错误

  

字符串或二进制数据将被截断。该声明已被终止

如何解决?谢谢

select * from testing1(2)

这是我创建表格的方式

CREATE TABLE stock(item       nvarchar(50) NULL,
                   warehouse   nvarchar(50) NULL,
                   price int NULL);

5 个答案:

答案 0 :(得分:58)

定义varchar etc without a length, the default is 1.

  

如果未在数据定义或变量声明语句中指定n,则默认长度为1.如果未使用CAST函数指定n,则默认长度为30.

因此,如果您希望@trackingItems1的{​​{1}}列中包含400个字符,请使用stock

否则,您尝试将> 1个字符放入nvarchar(400) =失败

作为评论,这也是bad use of table value function,因为它是“多语句”。它可以这样写,它会更好地运行

nvarchar(1)

当然,您可以使用普通的SELECT语句..

答案 1 :(得分:36)

目标列的最大长度小于您尝试插入的值。

在SQL管理器中右键单击该表,然后转到“设计”以可视化表结构和列定义。

编辑:

尝试在nvarchar插入上设置与表中定义的相同或更短的长度。

答案 2 :(得分:14)

在我的情况下,我收到此错误,因为我的表已

varchar(50)

但是我注入了67个字符的长字符串,导致了这个错误。将其更改为

varchar(255)

修复了问题。

答案 3 :(得分:8)

在[dbo]中指定项目仓库的大小。[testing1] FUNCTION

@trackingItems1 TABLE (
item       nvarchar(25)  NULL, -- 25 OR equal size of your item column
warehouse   nvarchar(25) NULL, -- same as above
price int   NULL

) 

因为在MSSQL中只说 nvarchar 等于nvarchar(1)所以 stock 表中列的值被截断

答案 4 :(得分:1)

SQL Server 2016 SP2 CU6和SQL Server 2017 CU12 引入了跟踪标志460,以便返回截断警告的详细信息。 您可以在查询级别或服务器级别启用它。

查询级别

INSERT INTO dbo.TEST (ColumnTest)
VALUES (‘Test truncation warnings’)
OPTION (QUERYTRACEON 460);
GO

服务器级别

DBCC TRACEON(460, -1);
GO

在SQL Server 2019中,您可以在数据库级别启用它:

ALTER DATABASE SCOPED CONFIGURATION 
SET VERBOSE_TRUNCATION_WARNINGS = ON;

旧的输出消息是:

Msg 8152, Level 16, State 30, Line 13
String or binary data would be truncated.
The statement has been terminated.

新的输出消息是:

Msg 2628, Level 16, State 1, Line 30
String or binary data would be truncated in table 'DbTest.dbo.TEST', column 'ColumnTest'. Truncated value: ‘Test truncation warnings‘'.

在将来的SQL Server 2019版本中,消息2628将默认替换消息8152。