Sql 需要解决以下代码问题

Sql 需要解决以下代码问题,sql,sql-server,sql-server-2008,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 上面的查询在一台机器上运行正常,没有任何问题。但我在另一台机器上运行时遇到了一些错误。这对我来说很有关系。我已附上屏幕截图 两台计算机都具有相同的sql server sql server 2008 R2 Express(Microsoft sql

我已经跑过下面的询问

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(英特尔X86)2010年4月2日15:53:02版权所有(c)在Windows NT 5.1上提供高级服务的Microsoft Corporation Express Edition(Build 2600:Service Pack 3))版本

这意味着一台机器的表名都少于20个字符,但它不工作的机器的表名超过20个字符

名称
列的大小更改为
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。
系统表中的
名称
列的定义为

sysname(nvarchar(128))
在第一台机器中,您可能没有任何超过20个字符的表名,因此它可以工作。但是,在第二台计算机中,表名的长度似乎超过了20个字符,因此出现了错误。尝试将@temp定义更改为

DECLARE @temp TABLE
(
ID int identity(1,1),
name nvarchar(128)
)

当您试图插入超过定义长度的字符串时,字符串或二进制数据将被截断。在您的情况下,该字符串为20,而试图放入该列的字符串大于20

分辨率:将其设置为nvarchar并增加长度。

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

由于Raj声明SQL Server中列名的数据类型为SYSNAME,因此只需使用它,因为它是向后和向前兼容的:

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

参见

Can;“我真的看不出错误。你能粘贴文本吗?@Pepe,放大,应该足够大,可以阅读。”。CTRL++我之前遇到过这样的错误。将varchar(20)更改为varchar(50)为什么是255或8000?表名的长度不能超过128,因为知道确切的数量对我来说似乎无关紧要,但问题的答案是增加列的长度。我通常使用sysname数据类型。