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


77

我在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);

17
这仅表示您要插入的值大于最大允许值。例如,一列最多只能包含5个字符,但是您要插入10个字符的字符串。
John Woo,

@JW,但在我的表中包含价格的值2,并且数据类型实际上相同(例如:int)
user2098512 2013年

调用函数的另一种方法是从表名中选择[dbo] .testing1(2)
DevelopmentIsMyPassion

当我尝试您的建议时,@ AshReva会显示此错误“找不到列“ dbo”或用户定义的函数或聚合“ dbo.testing1”,或者名称不明确。” 但我可以确认自己已经在表值函数中使用了此方法
user2098512

1
您可以包括库存表的架构定义吗?
凯恩

Answers:


69

当您定义varchar不带长度的etc时,默认值为1。

在数据定义或变量声明语句中未指定n时,默认长度为1。在CAST函数中未指定n时,默认长度为30。

因此,如果您希望@trackingItems1from的列中有400个字节stock,请使用nvarchar(400)

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

注释,这也是表值函数的不好用法,因为它是“多语句”。可以这样写,它将运行得更好

ALTER FUNCTION [dbo].[testing1](@price int)
RETURNS
AS
   SELECT ta.item, ta.warehouse, ta.price 
   FROM   stock ta
   WHERE  ta.price >= @price;

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


38

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

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

编辑:

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


对我来说,问题在于列的长度,因此在SQL Server中从更改nvarchar(50)ntext,可以解决此问题,希望对某人
有所

@stom,您应始终尝试使用尽可能短的数据长度。这样做可以使您的表尽可能的小而快速,并显示意图。如果某人需要在几年内对数据库进行索引或迁移,则他们将不得不找出为什么按这种方式设计表。就是说,如果您想在字段中使用“无限”文本,则ntext是可行的解决方案。
OakNinja

感谢您提供的有关性能的提示,现在我正在存储网站链接,并且其中一些链接很长,因此我选择了ntext。
shaijut 2015年

1
@stom您可以将其设置为nvarchar(2083),这是Internet Explorer的最大长度。这样,您可以最大程度地提高性能和兼容性。
OakNinja

nvarchar(2083)这里开始,ya是URL的最佳列类型,谢谢。
shaijut

19

就我而言,我收到此错误是因为我的桌子有

varchar(50)

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

varchar(255)

解决了问题。


:)更改为varchar(some_value)解决了我的问题。
Naveen Kumar V

8

如[dbo]中那样指定物料仓库的尺寸。[testing1]功能

@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表中的列值被截断了


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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.