sql - 如何从返回的列表中更新 SQL 中的数据类型
问题描述
我创建了一个数据库,并意识到在一大堆表中都有nvarchar(255)
数据类型的地方犯了一个错误。他们应该是日期时间。我试图通过运行一个简单的代码来修改所有这些。
首先,我运行下面的代码来识别所有表和其中包含“日期”一词的相关列名,因为我知道这些是需要更改数据类型的列:
select *
from MyDatabase.INFORMATION_SCHEMA.COLUMNS c
where c.COLUMN_NAME like '%date%'
我查看了列表并确认所有列中都没有任何数据。只有其中一些有 NULL 。如果需要,我可以删除这些数据。返回列表中也只有 3 个不能为 Null;其余的都可以为 Null。如果重要的话,我可以手动修改不可为空的。
我想像运行这样的代码:
select *
from MyDatabase.INFORMATION_SCHEMA.COLUMNS c
where c.COLUMN_NAME like '%date%' and c.IS_NULLABLE = 'yes'
ALTER COLUMN c.COLUMN_NAME LIKE '%date%' DATETIME [NULL] -- for the Nullable items
使用上面的代码,我试图使用以下链接中的逻辑: 如何更改 SQL Server 中列的数据类型?
不过,我知道我的上述实现是不正确的。谁能帮助我以正确的方式?提前致谢
解决方案
在mysql中你可以这样做。在其他sql数据库服务中也可以达到同样的效果,只是语法可能不同。
select CONCAT('ALTER TABLE ', c.TABLE_NAME, ' MODIFY COLUMN ', c.COLUMN_NAME, '
DATETIME;')
from INFORMATION_SCHEMA.COLUMNS c
where c.COLUMN_NAME like '%date%' and c.TABLE_SCHEMA='database_name'
基本上,您正在检索所有带有 date 一词的列,然后使用该CONCAT
函数来构建更改查询。然后,您只需要运行生成的查询。
推荐阅读
- javascript - 我无法在 Tampermonkey 的特定事件中播放声音
- python - 在 Python 中使用 Squeezenet 的 ImportError
- python - 如何在 Pandas 中使用 groupby 划分 2 个聚合列?
- javascript - 在反应中更新渲染组件的状态
- docker - 在 docker tensorflow/tensorflow:latest-gpu 中找不到 libcuda.so DSO
- azure-devops - Azure 管道 docker 无法复制多个项目
- python - 使用序列设置数组元素(Python)
- javascript - apply() 的输出
- c++ - c++ 中无符号位长类型之间的隐式转换,即 uint8_t,uint16_t
- mysql - 如何将表中的行与某些条件 Laravel 结合起来