Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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 Server-更改多表中显示的列的定义_Sql_Sql Server - Fatal编程技术网

SQL Server-更改多表中显示的列的定义

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

我的数据库中的许多表都有一个布尔列“IsDeleted”

我需要更改所有表中的列,默认值为零,然后用null值更新所有旧记录,使其值为零

除了为每个表编写脚本之外,还有一种方法可以做到这一点吗


谢谢,

有这么多表,请使用动态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。我的坏,把它作为一个指针,而不是一个实际的采取和使用过程。。。