【问题标题】:How to Alter Column from nvarchar(max) to nvarchar(50)如何将列从 nvarchar(max) 更改为 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() 不计算空格,我需要重新检查。但无论如何,如果截断成功,不会有任何数据丢失。

标签: sql-server sql-server-2008


【解决方案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,然后重命名。
猜你喜欢
  • 2021-06-26
  • 2013-12-12
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多