遍历结果集
Loop through a resultset
我想在我的数据库中向大约一百个 table 添加 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 但结果是列被添加到结果集中的第一个 table 但随后它因内存不足异常而崩溃错误。
是否有 better/efficient 循环遍历结果集并添加这些列的方法?我可以构建一个 SSIS 来做到这一点,但不能保证它会起作用。我知道游标通常很慢,但我认为 100 tables 它应该是可行的,即使有点慢。
在你的 WHILE
循环中,你缺少 Fetch Next
,没有它,它会创建一个无限循环,这就是你得到 out of memory exception
:[=14= 的原因]
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
这是我的做法。
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
我想在我的数据库中向大约一百个 table 添加 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 但结果是列被添加到结果集中的第一个 table 但随后它因内存不足异常而崩溃错误。
是否有 better/efficient 循环遍历结果集并添加这些列的方法?我可以构建一个 SSIS 来做到这一点,但不能保证它会起作用。我知道游标通常很慢,但我认为 100 tables 它应该是可行的,即使有点慢。
在你的 WHILE
循环中,你缺少 Fetch Next
,没有它,它会创建一个无限循环,这就是你得到 out of memory exception
:[=14= 的原因]
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
这是我的做法。
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