【问题标题】:Change NVARCHAR to VARCHAR column data type将 NVARCHAR 更改为 VARCHAR 列数据类型
【发布时间】:2014-08-28 09:50:30
【问题描述】:

尝试将列从 NVARCHAR(max) 更改为 VARCHAR(max) 时出现错误:

无法创建大于允许的最大行大小 8060 的大小为 8063 的行。

这是正确的,因为存储 unicode 字符需要不同的存储空间。但是有什么方法可以强制 SQL Server 进行这种转换吗?

EDIT:表定义和修改命令:

CREATE TABLE [Descriptions](
    [SerialNo] [varchar](20) NOT NULL,
    [LanguageCode] [char](2) NOT NULL,
    [Note] [nvarchar](max) NOT NULL,
    [Address] [varchar](2000) NOT NULL,
    [StoreId] [varchar](3) NULL,
CONSTRAINT [UK_Descriptions] UNIQUE NONCLUSTERED 
(
    [SerialNo] ASC,
    [LanguageCode] ASC,
    [StoreId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,     ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

-- Alter column:
ALTER TABLE [Descriptions]  ALTER COLUMN [Note] varchar(max) NOT null;

【问题讨论】:

  • nvarchar(max)varchar(max) 都可以存储在页外,因此它们只提供一个指向行大小限制的指针。这里一定有其他事情发生,你能发布表定义吗?
  • 这很奇怪。您是否尝试过 G.Nader 的建议:创建一个具有所需定义的新表,复制您的数据,删除旧表,然后重命名新表?
  • @Andomar 如果没有更简单的解决方案,我将需要尝试

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


【解决方案1】:

尝试先清空表然后进行更改,因为似乎一行存储了超过其限制的现有数据。取出数据,进行更改,然后重新插入数据。

【讨论】:

  • 行如何存储超过其限制的现有数据?
  • 不幸的是,如果更改此类型,它不会将数据移出一行。这是一种非常罕见的情况,你很倒霉。
【解决方案2】:
DECLARE @H nvarchar(max) = N'ESŐNAP' -- rainy day in Hungarian
SELECT CONVERT(varchar(max),@H)

result:
ESONAP

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多