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

Posted

技术标签:

【中文标题】如何将列从 nvarchar(max) 更改为 nvarchar(50)【英文标题】:How to Alter Column from nvarchar(max) to nvarchar(50) 【发布时间】:2016-07-25 12:54:38 【问题描述】:

我在 SQL SERVER 2008 中有一个现有表,其中一列是 NVARCHAR(MAX),并且它的值少于 10 个字符。 此表正在生产中,其中包含数据。

我有一个要求,我必须将此列从 NVARCHAR(MAX) 更改为 NVARCHAR(50)。 TSQL Server 在执行此操作时会出现一些截断错误,即使该列中的数据少于 10 个字符。

这是我的脚本:

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

【问题讨论】:

exact 错误是什么?你确定数据真的少于10个字符吗?尝试查询行WHERE LEN(Column1)>50。另请注意,NVARCHAR(MAX) 是用于存储 blob 的类型,SQL Server 可能不允许更改类型。这就是为什么您应该发布完整的错误消息 "该列中的数据少于 10 个字符" - 你确定吗?很容易出现尾随空格。请运行 SELECT * FROM dbo.TABLE WHERE LEN(Column1) > 50。 还有,真的是错误,还是警告? Hmmmmm - 添加到我上面的评论 - LEN 不计算尾随空格(根据 SQL 标准,令人惊讶的是微软这次遵守了),所以你必须使用 DATALENGTH 代替。由于是Unicode(NVARCHAR),每个字符是两个字节,所以检查WHERE DATALENGTH(Column1) > 100 我 100% 确定列数据少于 10 个字符。但正如你所说的 LEN() 不计算空格,我需要重新检查。但无论如何,如果截断成功,不会有任何数据丢失。 【参考方案1】:

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

SELECT DATALENGTH(Column_Name) AS FIELDSIZE, Column_Name 
FROM Table_Name 

如果一切正常,您可能已经检查了Prevent Saving Changes 选项。请按照以下步骤检查:

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

【讨论】:

防止保存更改仅在您使用那个糟糕的表格设计器时才有效。改为编写 alter table 语句会简单得多。 这需要访问生产数据库上的 Management Studio。我需要一些基于 SQL 脚本的解决方案。 如果您有实时服务器连接字符串,请尝试通过您的 sql 服务器连接。打开运行并键入 ssms 然后输入您的服务器名称,身份验证是 SQL Server 身份验证登录名和密码,并且在应用更改后,您已经在项目连接字符串中使用了此详细信息。谢谢【参考方案2】:

如果您确定不会丢失数据,那么:

Update myTable set myNVMaxCol = left(coalesce(myNVMaxCol,''),50);
Alter table myTable alter column myNVMaxCol nvarchar(50) not null;

【讨论】:

或者,将数据移动到新列,删除旧的comun,然后重命名。

以上是关于如何将列从 nvarchar(max) 更改为 nvarchar(50)的主要内容,如果未能解决你的问题,请参考以下文章

当索引依赖于该列而不重新创建索引时,如何将列从 null 更改为非 null?

将列从 varchar 更改为 int

将列从 varchar 转换为 nvarchar 是不是会更改存储在列中的字符串的编码?

Sequelize:将列类型更改为 ENUM

如何更改 SQL Server 中列的数据类型?

如何将表列从十进制更改为 varchar [重复]