代码之家  ›  专栏  ›  技术社区  ›  SSingh

遍历结果集

  •  1
  • SSingh  · 技术社区  · 6 年前

    我想在数据库中的大约一百个表中添加4个新列。为此,我使用以下方法:

    SET NOCOUNT ON
    DECLARE @T NVARCHAR(100)
    DECLARE @SQL NVARCHAR(MAX)
    
    DECLARE TABLE_CURSOR CURSOR FOR 
    SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE '%ABC_%'
    
     OPEN TABLE_CURSOR
    
     FETCH NEXT FROM TABLE_CURSOR 
     INTO @T
        WHILE @@FETCH_STATUS = 0
            BEGIN
    
                SET @SQL = N'ALTER TABLE ' + Quotename(@T) +
                    'ADD COL1 NVARCHAR(50),
                        COL2 NVARCHAR(50),
                        COL3 NVARCHAR(10),
                        COL4 NVARCHAR(6)'
                EXEC (@SQL)
    
            END 
    CLOSE TABLE_CURSOR  
    DEALLOCATE TABLE_CURSOR
    

    我也试过用 +@T + 而不是Quotename,但是所发生的是,这些列被添加到结果集中的第一个表中,但随后它崩溃并出现内存不足异常错误。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Ryan Wilson    6 年前

    WHILE loop,你错过了 Fetch Next out of memory exception

    WHILE @@FETCH_STATUS = 0
            BEGIN
    
                SET @SQL = N'ALTER TABLE ' + Quotename(@T) +
                    'ADD COL1 NVARCHAR(50),
                        COL2 NVARCHAR(50),
                        COL3 NVARCHAR(10),
                        COL4 NVARCHAR(6)'
                EXEC (@SQL)
    
                --Need this next line to move the cursor to the next record
                --Without this you create an infinite loop
                FETCH NEXT FROM TABLE_CURSOR INTO @T
    
    
            END 
    
        2
  •  0
  •   Markov    6 年前

    我会这样做的。

    DECLARE @SQL varchar(max);
    SET @SQL = '';
    SELECT @SQL = @SQL + 'ALTER TABLE '+ CAST(QUOTENAME(s.name) as Varchar(10))+'.'+Cast(QUOTENAME(t.name) as VARCHAR(50)) + ' ADD COL1 NVARCHAR(50), COL2 NVARCHAR(50),COL3 NVARCHAR(10), COL4 NVARCHAR(6); '
    FROM sys.tables t
    Join sys.all_columns ac on t.object_id = ac.object_id --Remove this join if you arent searching for tables with specific name
    JOIN sys.schemas s on t.schema_id = t.schema_id
    Where t.type = 'U' --tables 
          and s.schema_id = 1 --Your shema ID 
        --and ac.Name like '%Tables with this column%'
    
    --Exec(@SQL)
    PRINT @SQL