我遇到了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
如果未在数据定义或变量声明语句中指定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)
解决了这个问题.
指定项目和仓库的大小,如[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查询级别
\nINSERT INTO dbo.TEST (ColumnTest)\nVALUES (\xe2\x80\x98Test truncation warnings\xe2\x80\x99)\nOPTION (QUERYTRACEON 460);\nGO\nRun Code Online (Sandbox Code Playgroud)\n服务器级别
\nDBCC TRACEON(460, -1);\nGO\nRun Code Online (Sandbox Code Playgroud)\n从 SQL Server 2019 开始,您可以在数据库级别启用它:
\nALTER DATABASE SCOPED CONFIGURATION \nSET VERBOSE_TRUNCATION_WARNINGS = ON;\nRun Code Online (Sandbox Code Playgroud)\n旧的输出消息是:
\nMsg 8152, Level 16, State 30, Line 13\nString or binary data would be truncated.\nThe statement has been terminated.\nRun Code Online (Sandbox Code Playgroud)\n新的输出消息是:
\nMsg 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'.\nRun Code Online (Sandbox Code Playgroud)\n在未来的 SQL Server 2019 版本中,消息 2628 将默认替换消息 8152。
\n| 归档时间: |
|
| 查看次数: |
322728 次 |
| 最近记录: |