首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环通过结果集

循环通过结果集
EN

Stack Overflow用户
提问于 2018-09-13 16:10:29
回答 2查看 90关注 0票数 1

我想在数据库中的大约100个表中添加4个新列。要做到这一点,我将使用以下方法:

代码语言:javascript
复制
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,但是结果集中的第一个表中添加了列,但是随后它崩溃了,出现内存不足的异常错误。

是否有更好/更有效的方法循环遍历结果集并添加这些列?我可以建立一个SSIS来做到这一点,但不能保证它将工作。我知道游标通常是慢的,但我认为对于100张桌子,它应该是可行的,即使有点慢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-13 16:13:18

在您的WHILE循环中,您丢失了Fetch Next,如果没有它,它会创建一个无限循环,这就是为什么您要得到一个out of memory exception

代码语言:javascript
复制
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 
票数 1
EN

Stack Overflow用户

发布于 2018-09-13 17:52:41

我就是这样做的。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52317743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档