SqlServer中使用游标进行双重遍历

276 阅读1分钟

示例场景:循环遍历数据库中所有的数据表,然后再遍历每张数据表中的所有字段描述。

具体代码如下所示:

/*****************************************
	实例:使用游标进行双重遍历
*****************************************/

--定义遍历的表变量@TableName和数据表游标C_Table
DECLARE @TableName NVARCHAR(100)
--查询出数据库所有的用户表
DECLARE C_Table CURSOR FOR SELECT name FROM sysobjects WHERE xtype='u'
--打开游标、获取第一条数据
OPEN C_Table
FETCH NEXT FROM C_Table INTO @TableName
WHILE(@@FETCH_STATUS=0)
BEGIN
	--这里就是循环遍历的数据表名称
	--PRINT @TableName

	--遍历表@TableName的字段
	--定义遍历的字段名称变量@TableFieldName、字段描述变量@TableFieldDesc和表字段游标C_TableField
	DECLARE @TableFieldName NVARCHAR(100),
		@TableFieldDesc NVARCHAR(100)
	--查询出该数据表所有的字段及其描述
	DECLARE C_TableField CURSOR FOR
		SELECT b.name TableFieldName,CAST(c.value AS NVARCHAR(100)) TableFieldDesc FROM sys.tables a
		INNER JOIN sys.columns b ON b.object_id = a.object_id
		LEFT JOIN sys.extended_properties c ON c.major_id = b.object_id AND c.minor_id = b.column_id
		WHERE a.name =@TableName
	--打开游标、获取第一条数据
	OPEN C_TableField
	FETCH NEXT FROM C_TableField INTO @TableFieldName,@TableFieldDesc
	WHILE(@@FETCH_STATUS=0)
	BEGIN
		--这里就是循环遍历的字段名称和描述
		PRINT '数据表:'+@TableName+',字段:'+@TableFieldName+',描述:'+@TableFieldDesc

		FETCH NEXT FROM C_TableField INTO @TableFieldName,@TableFieldDesc
	END
	CLOSE C_TableField
	DEALLOCATE C_TableField

	FETCH NEXT FROM C_Table INTO @TableName
END
--关闭和释放游标
CLOSE C_Table
DEALLOCATE C_Table

测试效果: