是否有任何快捷方式可以使用单个查询将所有datetime
字段更改为SQL SERVER 2008 R2
中的date
字段,或者类似的东西,我需要将所有datetime
字段(包括table design
和stored procedures
中的字段)更改为date
字段。
如果您有足够的权限,则可以通过查询某些系统视图并执行动态 SQL 来执行类似操作。不过,公平的警告 - 如果这不是非常小心地完成,它可能会真正搞砸事情。更改数据类型是这样的事情,尽管很乏味,但受益于有人来监视它。我的代码应该只是一个插图,而不仅仅是复制和粘贴。
对于表字段,您可以使用INFORMATION_SCHEMA.COLUMNS
视图查找datetime
列,然后为每个列执行 DDL 语句。这意味着您需要使用游标,这对于生产中的 DML 语句来说是不受欢迎的,但我认为对于这些类型的 DDL 语句通常没问题。我将省略很多游标代码,因为这里重要的只是逻辑;如果您在编写该代码时需要帮助,请告诉我。
获取所有日期时间列的表名和列名:
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE = 'datetime'
然后,使用这些来执行一些动态 SQL:
DECLARE @sql nvarchar(4000);
SET @sql = N' ALTER TABLE ' + QUOTENAME(@table_name)
+ N' ALTER COLUMN ' + QUOTENAME(@column_name)
+ N' date NULL';
EXEC @sql;
对于存储过程,可以像这样获取存储过程的全文:
SELECT m.definition
FROM sys.objects AS o
INNER JOIN sys.sql_modules AS m
ON o.object_id = m.object_id
WHERE o.type = 'P';
这将为您提供每个过程的CREATE PROCEDURE
命令的文本。然后,您可以运行如下内容:
SET @definition = REPLACE(
REPLACE(@definition, 'CREATE PROCEDURE', 'ALTER PROCEDURE')
, 'datetime', 'date');
EXEC @definition;