需要解决此以下代码问题

时间:2013-11-27 06:11:06

标签: sql sql-server sql-server-2008

我有以下查询

DECLARE @temp TABLE(Id int identity(1,1), name varchar(20))
INSERT INTO @temp (name)
select name from sys.tables

上述查询在一台计算机enter image description here中的任何问题都能正常运行。但我通过一些错误运行另一台机器。它非常适合我。我附上了屏幕截图。

两台计算机都具有相同的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))版本上的服务。

4 个答案:

答案 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)

namesys.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

请参阅What is SYSNAME data type in SQL Server?

相关问题