88

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

5 回答 5

72

当你定义varcharetc 时没有长度,默认为 1。

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

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

否则,您试图将 >1 个字符放入nvarchar(1)= fail

作为评论,这也是对表值函数的不好使用,因为它是“多语句”。可以这样写,运行起来会更好

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

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

于 2013-02-22T08:06:21.123 回答
43

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

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

编辑:

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

于 2013-02-22T08:05:13.443 回答
24

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

varchar(50)

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

varchar(255)

解决了这个问题。

于 2016-07-20T08:17:52.387 回答
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) 因此库存表中列的值被截断

于 2013-02-22T08:09:47.987 回答
4

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。

于 2020-07-15T08:05:29.763 回答