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

我遇到了SQL服务器的一些问题,这是我创build的function:

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; 

当我编写一个查询来使用像下面这样的函数时,得到错误

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

如何解决? 谢谢

 select * from testing1(2) 

这是我创build表的方式

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

当你定义varchar等没有长度,默认是1。

当在数据定义或variables声明语句中未指定n时,缺省长度为1.当未使用CAST函数指定n时,缺省长度为30。

所以,如果您期望stock @trackingItems1列中有400个字符,请使用nvarchar(400)

否则,您正试图将nvarchar(1) = fail中的大于1个字符

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

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

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

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

右键单击SQLpipe理器中的表,然后转到“devise”,以查看您的表结构和列定义。

编辑:

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

指定项目仓库的大小,如[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),因此股票表中列的值被截断

在我的情况下,我得到这个错误,因为我的表

 varchar(50) 

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

 varchar(255) 

解决了这个问题。