9

我想在我的 SQL 数据库中的所有表上运行“Alter Table”:

ALTER TABLE test ADD  CONSTRAINT [COLLUM_NAME]  DEFAULT ((0)) FOR [COLLUM_NAME]

我知道如何从数据库中获取所有现有表:

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'

或者

USE DATABASE_NAME
GO 
SELECT name
FROM sys.Tables
GO

但我不知道如何将这两者结合起来。

在我的数据库(50 多个表)中,所有表共有 1 行。我想为所有这些行设置一个默认值。

4

5 回答 5

8

您可以尝试生成命令并在之后执行它。你可以这样做:

SELECT CONCAT("Alter Table `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` this is my default value change on the column") as MySQLCMD 
FROM TABLES 

并执行检索。

于 2013-04-08T08:50:09.663 回答
1

如果这是一个不需要自动化的一次性过程,那么您可能会比运行以下内容并仅复制/粘贴输出做得更糟:

select 'alter table ' + t.name + ' add constraint ' + c.name + ' default ((0)) for ' + c.name
from    sysobjects t join syscolumns c on c.id = t.id
where   t.xtype = 'U'
于 2013-04-08T08:48:54.460 回答
0

设置'COLUMN NAME'并执行,它将为设置的列添加默认约束。

DECLARE @sql NVARCHAR(MAX) ;
DECLARE @LINEBREAK AS VARCHAR(2)
SET @LINEBREAK = CHAR(13) + CHAR(10)      

SELECT  @sql = COALESCE(@sql + ';' + @LINEBREAK, '') + 'ALTER TABLE ' 
        + QUOTENAME([TABLES].TABLE_NAME) + ' ADD  CONSTRAINT ' + QUOTENAME([COLUMNS].COLUMN_NAME)
        + ' DEFAULT ((0)) FOR ' + QUOTENAME([COLUMNS].COLUMN_NAME)
FROM    INFORMATION_SCHEMA.TABLES [TABLES]
        INNER JOIN INFORMATION_SCHEMA.COLUMNS AS [COLUMNS] ON [TABLES].TABLE_NAME = [COLUMNS].TABLE_NAME
WHERE   TABLE_TYPE = 'BASE TABLE'
        AND [COLUMNS].[COLUMN_NAME] = 'COLUMN NAME'
PRINT @sql
EXEC sp_executesql @sql
于 2013-04-08T09:25:41.353 回答
0

如果你想使用INFORMATION_SCHEMA

SELECT 'ALTER TABLE ' +t.TABLE_NAME+ ' ADD  CONSTRAINT '
+c.COLUMN_NAME  +' DEFAULT ((0)) FOR '+c.COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.COLUMNS c on t.TABLE_NAME=c.TABLE_NAME
WHERE TABLE_TYPE = 'BASE TABLE'
于 2013-04-08T08:53:43.757 回答
0

我首选的方法是为此编写一个 SP。我的数据库中有一些这样的实用程序 SP,我会根据需要更改它们以更新内容。这是一个更改排序规则的示例。您可以看到,通过修改 SET @S=... 语句,您可以进行任何您喜欢的表更改。

DECLARE table_name VARCHAR(255);
DECLARE end_of_tables INT DEFAULT 0;
DECLARE num_tables INT DEFAULT 0;

DECLARE cur CURSOR FOR 
    SELECT t.table_name 
    FROM information_schema.tables t 
    WHERE t.table_schema = DATABASE() AND t.table_type='BASE TABLE';

DECLARE CONTINUE HANDLER FOR NOT FOUND SET end_of_tables = 1;

OPEN cur;

tables_loop: LOOP

    FETCH cur INTO table_name;

    IF end_of_tables = 1 THEN
        LEAVE tables_loop;
    END IF;

    SET num_tables = num_tables + 1;

    SET @s = CONCAT('ALTER TABLE ' , table_name , ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci');

    PREPARE stmt FROM @s;
    EXECUTE stmt;
END LOOP;

CLOSE cur;
于 2014-08-11T16:04:25.677 回答