Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将Nvarchar(最大值)转换为Nvarchar(30)的最佳/最有效方法_Sql_Sql Server_Tsql_Type Conversion - Fatal编程技术网

Sql 将Nvarchar(最大值)转换为Nvarchar(30)的最佳/最有效方法

Sql 将Nvarchar(最大值)转换为Nvarchar(30)的最佳/最有效方法,sql,sql-server,tsql,type-conversion,Sql,Sql Server,Tsql,Type Conversion,我想知道是否有人能给我一个关于这个问题的指示。我想其他人以前也经历过这种情况,并且想知道什么是最有效的 我处理生产数据需要很长时间,主要是因为我们没有在ID字段上设置索引 ID字段当前是nvarchar(max),因此无法对其编制索引。这个ID永远不会超过30个字符,因此我想将数据类型更改为nvarchar(30)。但是,我注意到使用以下语句: ALTER TABLE [dbo].[Table] ALTER COLUMN [Column1] NVARCHAR ( 30 ) NOT NULL 对

我想知道是否有人能给我一个关于这个问题的指示。我想其他人以前也经历过这种情况,并且想知道什么是最有效的

我处理生产数据需要很长时间,主要是因为我们没有在ID字段上设置索引

ID字段当前是nvarchar(max),因此无法对其编制索引。这个ID永远不会超过30个字符,因此我想将数据类型更改为nvarchar(30)。但是,我注意到使用以下语句:

ALTER TABLE [dbo].[Table] ALTER COLUMN [Column1] NVARCHAR ( 30 ) NOT NULL
对于已经较小的表,需要花费大量的时间。我担心它甚至可能不适用于较大的表,因为对于较小的表,DiskIO已经非常高了

下面的方法会更快吗?是否可行

  • 使用nvarchar(30)数据类型创建一个新列
  • 然后将数据从nvarchar(max)列复制到nvarchar(30)列
  • 然后拆下nvarchar(max)列
  • 然后将nvarchar(30)列重命名为nvarchar(max)列的名称
有没有人对什么可能更好有什么建议


任何提示/帮助都将不胜感激

我们通过创建一个空的新列(NULL)并批量更新来解决类似的问题

update top (5000) myTable --parentheses are mandatory, set a small number to avoid transaction log issues
set newCol = oldCol -- or left(oldCol,30) not sure your data
where newCol is null

go 10000 --runs 10,000 times, set accordingly to your rows amount, this covers 50 million rows(5,000x10,000) 

我建议将数据复制到另一个位置,截断表,更改数据类型,然后重新插入数据。您将希望以最低级别或使用
批量插入来完成最后一部分的日志记录。谢谢,我将尝试此方法,然后返回给您,看看是否有效!