SQL Server-更改多表中显示的列的定义
我的数据库中的许多表都有一个布尔列“IsDeleted” 我需要更改所有表中的列,默认值为零,然后用null值更新所有旧记录,使其值为零 除了为每个表编写脚本之外,还有一种方法可以做到这一点吗SQL Server-更改多表中显示的列的定义,sql,sql-server,Sql,Sql Server,我的数据库中的许多表都有一个布尔列“IsDeleted” 我需要更改所有表中的列,默认值为零,然后用null值更新所有旧记录,使其值为零 除了为每个表编写脚本之外,还有一种方法可以做到这一点吗 谢谢,有这么多表,请使用动态SQL执行alter declare @tab_name varchar(120) declare @the_sql varchar(1000) declare MyCursor cursor for select distinct table_name from INFOR
谢谢,有这么多表,请使用动态SQL执行
alter
declare @tab_name varchar(120)
declare @the_sql varchar(1000)
declare MyCursor cursor
for
select distinct table_name
from INFORMATION_SCHEMA.COLUMNS
where column_name = 'IsNumeric'
open MyCursor
fetch next from MyCursor into @tab_name
while @@fetchstatus = 0
begin
set @the_sql = 'alter table ' + @tab_name + ' add NewNumeric bit default 0'
execute (@the_sql)
fetch next from MyCursor into @tab_name
end
close MyCursor
deallocate MyCursor
冲洗并重复以更新值,删除旧列,然后更新新列这将是生成所需的创建、更新和重命名脚本的良好起点。建议:首先测试数据库备份
select
'ALTER TABLE dbo.' + O.Name + ' ADD IsDeletedNew bit default 0;
UPDATE dbo.' + O.Name + ' SET IsDeletedNew = 1 WHERE IsDeleted = 1;
UPDATE dbo.' + O.Name + ' SET IsDeletedNew = 0 WHERE IsDeleted = 0 OR IsDeleted IS NULL;
ALTER TABLE dbo.' + O.Name + ' DROP COLUMN IsDeleted;
EXECUTE sp_rename N''dbo.' + O.Name + '.IsDeletedNew'', N''Tmp_IsDeleted_1'', ''COLUMN''
EXECUTE sp_rename N''dbo.' + O.Name + '.Tmp_IsDeleted_1'', N''IsDeleted'', ''COLUMN'' '
from syscolumns C
Inner join sysobjects o on C.ID = O.ID
where c.name = 'IsDeleted'
首先,我可以为布尔字段设置默认值。这对我有用
ALTER TABLE [dbo].<TableName> ADD DEFAULT 0 FOR IsDeleted
DECLARE @NAME VARCHAR(100)
DECLARE @SQL NVARCHAR(300)
DECLARE CUR CURSOR
FOR
SELECT t.name AS 'TableName'
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name = 'IsDeleted'
AND (SELECT object_definition(default_object_id) AS definition
FROM sys.columns
WHERE name ='IsDeleted'
AND object_id = object_id(t.name)) is null
OPEN CUR
FETCH NEXT FROM CUR INTO @NAME
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = 'ALTER TABLE [dbo].'+@NAME+' ADD DEFAULT 0 FOR IsDeleted'
--PRINT @SQL -- will print all the update scripts
EXEC Sp_executesql @SQL
FETCH NEXT FROM CUR INTO @NAME
END
CLOSE CUR
DEALLOCATE CUR
恐怕你得为这部电影写剧本了。或手动修改每个字段。为什么不写个剧本呢?这并不难。动态SQL方法会奏效,尽管您需要创建一个新列,更新所述列中的值,删除旧列,然后重命名新列SqlAndOtherStuffGuy,有超过100个包含该列的表,所以每个表都需要一个脚本。JohnHC,我不能删除旧列,因为这样数据就会被删除。@Zag Gol我想JohnHC说的是你会创建一个新的列。用现有列中的数据更新该列中的数据。删除旧列,然后重命名新列。问题是,您不能向位列添加默认的true | false约束,也不能允许空值。@TT。我的坏,把它作为一个指针,而不是一个实际的采取和使用过程。。。