如何将列从nvarchar(max)更改为nvarchar(50)

5

我在 SQL SERVER 2008 中有一张现有的表格,其中一个列是 NVARCHAR(MAX),并且它只有小于10个字符的值。

这个表格正在运行,并有数据。

我有一个需求,需要将这个列从 NVARCHAR(MAX) 修改为 NVARCHAR(50)。但是在进行此操作时,SQL Server 会给出一些截断错误,尽管该列中的数据少于10个字符。

以下是我的脚本:

ALTER TABLE [dbo].[Table] ALTER COLUMN [Column1] NVARCHAR ( 50 ) NOT NULL 

3
确切的错误是什么?您确定数据确实少于10个字符吗?尝试查询行WHERE LEN(Column1)>50。还要注意,NVARCHAR(MAX)是用于存储二进制大对象(BLOB)的类型,SQL Server可能不允许更改类型。这就是为什么您应该发布完整错误消息的原因。 - Panagiotis Kanavos
4
"那一列的数据少于10个字符" - 你确定吗?可能存在尾随空格。请执行SELECT * FROM dbo.TABLE WHERE LEN(Column1) > 50。" - Reversed Engineer
1
还有,这真的是一个错误吗,还是一个警告? - HoneyBadger
1
嗯 - 补充一下我的上面的评论 - LEN 不会计算尾随空格(根据 SQL 标准,令人惊讶的是这次 Microsoft 遵守了),所以你必须使用 DATALENGTH。由于它是 Unicode (NVARCHAR),每个字符占两个字节,因此请检查 WHERE DATALENGTH(Column1) > 100 - Reversed Engineer
我非常确定该列数据少于10个字符。但是正如你所说,LEN()不会计算空格,因此我需要重新检查。但无论如何,如果截断成功发生,也不会有任何数据丢失。 - Pradeep
显示剩余4条评论
2个回答

5

首先使用以下查询检查您的表数据:

SELECT DATALENGTH(Column_Name) AS FIELDSIZE, Column_Name 
FROM Table_Name 

如果一切正常,你可能已经勾选了“防止保存更改”的选项。按照以下步骤进行检查:

工具 > 设计 取消勾选防止需要重新创建表格的更改


如果您正在使用那个可怕的表格设计师,那么“防止保存更改”才有效。相比之下,编写“修改表”语句会简单得多。 - Sean Lange
这需要在生产数据库上访问管理工作室。我需要一些基于SQL脚本的解决方案。 - Pradeep
如果您有实时服务器连接字符串,请尝试通过 SQL Server 进行连接。 打开运行并键入 ssms,然后输入您的服务器名称, 身份验证为 SQL Server 身份验证 登录名和密码以及此详细信息已在您的项目连接字符串中使用,之后应用更改。谢谢 - user6503890

3
如果您确定不会丢失数据,那么:
Update myTable set myNVMaxCol = left(coalesce(myNVMaxCol,''),50);
Alter table myTable alter column myNVMaxCol nvarchar(50) not null;

1
或者,将数据移动到新列中,删除旧列,然后重命名。 - HLGEM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接