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

use*_*512 75 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;
Run Code Online (Sandbox Code Playgroud)

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

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

怎么解决?谢谢

select * from testing1(2)
Run Code Online (Sandbox Code Playgroud)

这是我创建表格的方式

CREATE TABLE stock(item       nvarchar(50) NULL,
                   warehouse   nvarchar(50) NULL,
                   price int NULL);
Run Code Online (Sandbox Code Playgroud)

gbn*_*gbn 64

没有长度的情况下定义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;
Run Code Online (Sandbox Code Playgroud)

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


Oak*_*nja 37

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

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

编辑:

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


Ham*_*han 17

在我的情况下,我得到了这个错误,因为我的桌子有

varchar(50)
Run Code Online (Sandbox Code Playgroud)

但是我注入了67个字符长的字符串,导致了这个错误.把它改成

varchar(255)
Run Code Online (Sandbox Code Playgroud)

解决了这个问题.


Deb*_*Deb 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

) 
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

\n

查询级别

\n
INSERT INTO dbo.TEST (ColumnTest)\nVALUES (\xe2\x80\x98Test truncation warnings\xe2\x80\x99)\nOPTION (QUERYTRACEON 460);\nGO\n
Run Code Online (Sandbox Code Playgroud)\n

服务器级别

\n
DBCC TRACEON(460, -1);\nGO\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
ALTER DATABASE SCOPED CONFIGURATION \nSET VERBOSE_TRUNCATION_WARNINGS = ON;\n
Run Code Online (Sandbox Code Playgroud)\n

旧的输出消息是:

\n
Msg 8152, Level 16, State 30, Line 13\nString or binary data would be truncated.\nThe statement has been terminated.\n
Run Code Online (Sandbox Code Playgroud)\n

新的输出消息是:

\n
Msg 2628, Level 16, State 1, Line 30\nString or binary data would be truncated in table 'DbTest.dbo.TEST', column 'ColumnTest'. Truncated value: \xe2\x80\x98Test truncation warnings\xe2\x80\x98'.\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n