我遇到了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);
答案 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。