It basically works, e.g.
DECLARE tables CURSOR FOR SELECT object_id, name FROM sys.tables; DECLARE @object_id INT; DECLARE @name SYSNAME; DECLARE @NO_ERROR INT = 0; OPEN tables; FETCH NEXT FROM tables INTO @object_id, @name; WHILE @@FETCH_STATUS = @NO_ERROR BEGIN PRINT @name; DECLARE columns CURSOR FOR SELECT name FROM sys.columns WHERE object_id = @object_id; OPEN columns; WHILE @@FETCH_STATUS = @NO_ERROR BEGIN PRINT ' ' + @name; FETCH NEXT FROM columns INTO @name; END; CLOSE columns; DEALLOCATE columns; FETCH NEXT FROM tables INTO @object_id, @name; END; CLOSE tables; DEALLOCATE tables;
But there's offten no need for nesting it:
DECLARE both CURSOR FOR SELECT T.name, C.name FROM sys.tables T INNER JOIN sys.columns C ON C.object_id = T.object_id;; DECLARE @table_name SYSNAME; DECLARE @column_name SYSNAME; DECLARE @last_name SYSNAME; DECLARE @NO_ERROR INT = 0; SET @last_name = ''; OPEN both; FETCH NEXT FROM both INTO @table_name, @column_name; WHILE @@FETCH_STATUS = @NO_ERROR BEGIN IF ( @last_name != @table_name ) BEGIN PRINT @table_name; PRINT ' ' + @column_name; END ELSE BEGIN PRINT ' ' + @column_name; END; SET @last_name = @table_name; FETCH NEXT FROM both INTO @table_name, @column_name; END; CLOSE both; DEALLOCATE both;
So check your conditions in both cursor definitions.
No comments:
Post a Comment