【问题标题】:Add columns to specific tables将列添加到特定表
【发布时间】:2022-01-14 02:41:12
【问题描述】:

我有多个表,例如大约 2000 个表,其中少数表是启用了 change_tracking 的表。我只需要向那些 change_tracking_enabled 表添加额外的列。

我的代码正在向所有 2000 个表添加列。我只需要为 CHANGE_TRACKING_ENABLED 表添加列。请帮帮我

  1. 这是我显示 change_tracking_enabled 表的代码。
    USE Test
    GO
    SELECT s.name as Schema_name, t.name AS Table_name, tr.*
    FROM sys.change_tracking_tables tr
    INNER JOIN sys.tables t on t.object_id = tr.object_id
    INNER JOIN sys.schemas s on s.schema_id = t.schema_id
    
  2. 这是我将列添加到所有 2000 个表的代码。
    USE TestDB
    GO
    --Declare Variables
    DECLARE @TableName VARCHAR(100)
    DECLARE @TableSchema VARCHAR(100)
    DECLARE @COLUMN_NAME VARCHAR(50)
    SET @COLUMN_NAME='ddtm' -- Change Column Name according to your requirement
    DECLARE @COLUMN_DATATYPE VARCHAR(50)
    SET @COLUMN_DATATYPE='DateTime' -- Provide data type for column
    
    --Declare Cursor
    DECLARE CUR CURSOR FOR
      SELECT TABLE_SCHEMA,
             TABLE_NAME
      FROM   INFORMATION_SCHEMA.TABLES
      WHERE  TABLE_TYPE = 'BASE TABLE'
    --OPEN CURSOR
    OPEN CUR
    --Fetch First Row
    FETCH NEXT FROM CUR INTO @TableSchema,@TableName
    --Loop
    WHILE @@FETCH_STATUS = 0
      BEGIN
    
      DECLARE @SQL NVARCHAR(MAX)
      SET @SQL=NULL
      IF NOT EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS 
           WHERE TABLE_NAME=@TableName AND COLUMN_NAME=@COLUMN_NAME 
    and Table_Schema=@TableSchema)
      BEGIN
      SET @SQL='ALTER TABLE '+@TableSchema+'.'+@TableName +' ADD '+@COLUMN_NAME
                             + ' '+@COLUMN_DATATYPE
        PRINT @SQL
        EXEC ( @SQL)
      END
    
      IF EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS 
                  WHERE TABLE_NAME=@TableName AND COLUMN_NAME=@COLUMN_NAME 
    and Table_Schema=@TableSchema)
      BEGIN
      PRINT 'Column Already exists in Table'
      END
          FETCH NEXT FROM CUR INTO @TableSchema,@TableName
      END
    --Close and Deallocate Cursor
    CLOSE CUR
    DEALLOCATE CUR
    

【问题讨论】:

  • 似乎您只需要检查在将数据放入您的CURSOR 的查询中是否启用了更改跟踪。这回答了你的问题了吗? How to check if change tracking is enabled on a specific table
  • 不...我只需要向 change_tracking_enabled 表添加额外的列。
  • 是的,但是您在CURSOR 中获取数据的查询不是您在步骤 1 中使用的查询;您要求 所有 表...使用您在第 1 步中的查询...
  • 我不知道如何添加它...我是编程新手。

标签: sql sql-server tsql


【解决方案1】:

查询

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

SELECT s.name as Schema_name, t.name AS Table_name, tr.*
FROM sys.change_tracking_tables tr
INNER JOIN sys.tables t on t.object_id = tr.object_id
INNER JOIN sys.schemas s on s.schema_id = t.schema_id

是否相同,当然您会得到不同的结果...使用您在第 1 步中使用的查询(减去 tr.*)作为步骤2中的查询;因为这会为您提供具有 CDC 的表。

【讨论】:

  • 能否请您发送代码.....我该怎么做?...
  • 使用您的复制和粘贴功能,@Vijayashree ...
  • --Declare Cursor DECLARE CUR CURSOR FOR SELECT s.name as Schema_name, t.name AS Table_name, tr.* FROM sys.change_tracking_tables tr INNER JOIN sys.tables t on t.object_id = tr. object_id INNER JOIN sys.schemas s.schema_id = t.schema_id --SELECT TABLE_SCHEMA, -- TABLE_NAME --FROM INFORMATION_SCHEMA.TABLES -- WHERE TABLE_TYPE = 'BASE TABLE'-- --OPEN CURSOR OPEN CUR --Fetch First Row FETCH NEXT FROM CUR INTO @TableSchema,@TableName --Loop WHILE @@FETCH_STATUS = 0 BEGIN
  • 你的意思是这样的
  • tr.* 不应该在那里
猜你喜欢
  • 1970-01-01
  • 2021-11-18
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
相关资源
最近更新 更多