模式中的更改表

问题描述 投票:0回答:2

我正在尝试为列(Inserted_time)设置默认值,但是首先我需要检查表中是否存在该列。如果该列不存在,则需要添加该列并为其提供默认值。我正在使用Sql Server Management Studio。到目前为止,我已经编写了以下代码:

IF EXISTS ( select TABLE_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_CATALOG = 'DB_COPY' and COLUMN_NAME = 'Inserted_Time')
    begin
    ALTER TABLE table_name ADD CONSTRAINT [Inserted_Time_Def] SET DEFAULT (sysdatetimeoffset()) FOR [Inserted_Time]
    end

    else

    ALTER TABLE table_name ADD COLUMN [Inserted_Time] CONSTRAINT [Inserted_Time_Def] DEFAULT (sysdatetimeoffset()) WITH VALUES

一旦检索到具有该列的表,我需要将该table_name添加到Alter命令。但我无法做到这一点。有人可以告诉我如何使用alter语句中从select语句检索的table_names吗?

sql-server tsql ddl
2个回答
0
投票

首先,您希望将所有表名放在一个临时表中,以便您可以循环浏览它。

之后,您可以使用光标为每个表名称执行命令。

在我的示例中,我只打印了我想执行的命令。这样,您可以确定代码将首先执行您想要的操作。

示例:

select TABLE_NAME As TableName INTO #TablesList from INFORMATION_SCHEMA.COLUMNS where TABLE_CATALOG = 'DB_COPY' and COLUMN_NAME = 'Inserted_Time'

DECLARE @TablesCursor as CURSOR;
DECLARE @TableName as NVARCHAR(max);

DECLARE @CommandToExecute as NVARCHAR(max);

SET @TablesCursor = CURSOR FOR SELECT TableName FROM #TablesList;

OPEN @TablesCursor;
FETCH NEXT FROM @TablesCursor INTO @TableName;

WHILE @@FETCH_STATUS = 0
BEGIN

 SET @CommandToExecute = 'ALTER TABLE ' + @TableName + ' WHAT YOU WANNA DO '
 PRINT @CommandToExecute
 --EXEC(@CommandToExecute)

 FETCH NEXT FROM @TablesCursor INTO @TableName;

END

CLOSE @TablesCursor;
DEALLOCATE @TablesCursor;

0
投票

假定每个表都在不同的架构中,那么您可以执行以下操作:

DECLARE @SQL nvarchar(MAX);
SET @SQL = STUFF((SELECT NCHAR(13) + NCHAR(10) +
                         CASE WHEN EXISTS (SELECT 1
                                           FROM INFORMATION_SCHEMA.COLUMNS C
                                           WHERE T.TABLE_SCHEMA = C.TABLE_SCHEMA
                                             AND T.TABLE_NAME = C.TABLE_SCHEMA
                                             AND C.COLUMN_NAME = N'Inserted_Time') THEN N'ALTER TABLE ' + QUOTENAME(T.TABLE_SCHEMA) + N'.' + QUOTENAME(T.TABLE_NAME) + N' ADD CONSTRAINT [Inserted_Time_Def] DEFAULT (sysdatetimeoffset()) FOR [Inserted_Time];'
                                                                                   ELSE N'ALTER TABLE ' + QUOTENAME(T.TABLE_SCHEMA) + N'.' + QUOTENAME(T.TABLE_NAME) + N' ADD COLUMN [Inserted_Time] CONSTRAINT [Inserted_Time_Def] DEFAULT (sysdatetimeoffset());'
                        END
                  FROM INFORMATION_SCHEMA.TABLES T
                  WHERE T.TABLE_CATALOG = N'DB_COPY'
                  FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,2,N'');

PRINT @SQL; --Your best friend. If more than 4,000 characters, use SELECT

EXECUTE sp_executesql @SQL;

如果您有很多模式,这很可能会极大地执行CURSOR解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.