我有以下查询
DECLARE @temp TABLE(Id int identity(1,1), name varchar(20))
INSERT INTO @temp (name)
select name from sys.tables
上述查询在一台计算机中的任何问题都能正常运行。但我通过一些错误运行另一台机器。它非常适合我。我附上了屏幕截图。
两台计算机都具有相同的SQL Server SQL Server 2008 R2 Express(Microsoft SQL Server 2008 R2(RTM) - 10.50.1600.1(Intel X86)2010年4月2日15:53:02版权所有(c)Microsoft Corporation Express Edition with Advanced Windows NT 5.1(Build 2600:Service Pack 3))版本上的服务。
答案 0 :(得分:1)
这意味着一台计算机的表名都少于20个字符,但它不能处理的计算机的表名长度超过20个字符。
将name
列的大小更改为nvarchar(255)
;如果你还有问题,你可以一直到4000。
DECLARE @temp TABLE(Id int identity(1,1), name nvarchar(255))
INSERT INTO @temp (name)
select name from sys.tables
编辑:根据@ Raj的回复和我后来的研究,我将'varchar'列修改为'nvarchar',因为这就是表名所能容纳的。对于快速查询,我个人并不关心我是否使用255而不是列名称的实际可能长度(128)。但是根据@Raj和T-SQL文档,最大列名长度为128。
http://technet.microsoft.com/en-us/library/ms188348.aspx
答案 1 :(得分:0)
name
中sys.tables
列的定义是
sysname(nvarchar(128))
在第一台机器中,您可能没有任何超过20个字符的表名,因此它可以正常工作。但是,在第二台机器中,看起来你有超过20个字符的表名,因此错误。尝试将@temp定义更改为
DECLARE @temp TABLE
(
ID int identity(1,1),
name nvarchar(128)
)
答案 2 :(得分:0)
当您尝试插入超过定义长度的字符串时,字符串或二进制数据将被截断,在您的情况下,它是20,并且尝试适合该列的字符串大于20。
解决方案:将其设为nvarchar并增加长度。
DECLARE @temp TABLE(Id int identity(1,1), name nvarchar(255))
INSERT INTO @temp (name)
select name from sys.tables
答案 3 :(得分:0)
由于Raj声明SQL Server中列名的数据类型是SYSNAME,因此只需使用它,因为它既可以向后兼容也是如此:
DECLARE @temp TABLE(Id int identity(1,1), name sysname)
INSERT INTO @temp (name)
select name from sys.tables