-1

我试图弄清楚是否有一种快速方法或单个查询可以向数据库中的所有表添加一个新列。

现在我正在为每张桌子做这个

ALTER TABLE [dbo].[%TABLE_NAME%] ADD %COLUMN_NAME% DATATYPE NOT NULL DEFAULT %VALUE%;

是否可以在 AzureDataStudio 中进行程序或查询,以向具有相同名称和默认值的所有表添加新列。

4

2 回答 2

0

我会亲自创建一个带有动态 SQL 的循环,该循环在运行时被执行。下面的代码创建了一个临时表,该表用于循环,该循环将根据计算的行号遍历临时表中列出的每个表。然后设置并执行动态 SQL。

一旦您进行了必要的更改,输入您的数据库名称、列名、数据类型和默认值,并且您对打印的结果感到满意,您可以取消注释EXECUTE(@SQL)并重新运行脚本,它将添加所有表格的新列。

USE [INSERT DATABASE NAME HERE]
GO

IF OBJECT_ID(N'tempdb..#TempSysTableNames') IS NOT NULL
BEGIN
    DROP TABLE #TempSysTableNames
END;

DECLARE @ColumnName VARCHAR(250) = 'INSERT COLUMN NAME HERE'
        ,@DataType VARCHAR(250) = 'INSERT DATA TYPE HERE'
        ,@DefaultValue VARCHAR(250) = 'INSERT DEFAULT VALUE HERE'
        ,@SQL VARCHAR(8000)
        ,@MaxRowNum INT
        ,@I INT = 1;

SELECT '[' + DB_NAME() + '].[' + OBJECT_SCHEMA_NAME([object_id],DB_ID()) + '].[' + name + ']' AS [name]
        ,ROW_NUMBER() OVER (ORDER BY [create_date]) AS RowNum
INTO #TempSysTableNames
FROM sys.tables
WHERE [type] = 'U';

SET @MaxRowNum = (SELECT MAX(RowNum)
                 FROM #TempSysTableNames);

WHILE (@I <= @MaxRowNum)
BEGIN

    SET @SQL = (SELECT 'ALTER TABLE ' + [name] + ' ADD ' + @ColumnName + ' ' + @DataType + ' NOT NULL DEFAULT ' + @DefaultValue + ';'
                FROM #TempSysTableNames
                WHERE RowNum = @I);

    PRINT(@SQL);
    --EXECUTE(@SQL);

    SET @I += 1;

END;
于 2021-03-10T22:27:40.310 回答
0
    select 'ALTER TABLE ' + QUOTENAME(SCHEMA_NAME([schema_id])) + '.' + QUOTENAME([name])
        + ' ADD %COLUMN_NAME% DATATYPE NOT NULL DEFAULT %VALUE%;'
    from sys.tables

使用上述创建您需要的语句,然后运行它们。

于 2021-03-10T20:38:35.150 回答