查询视图中所有字段名、字段所在表,字段描述。

荣蓝科创 2011-10-25 04:21:16
从网上查了很久,没有查了很多信息都不对,sp_depends也试过了,但是查询出来的内容比实际的视图多两条,这两条都是join中on的字段出现了两遍,我想查出跟实际的视图列一样的内容,现在卡在视图的列位于哪个表中这个地方,没有找出他们之间的关联,恳请高手帮忙指点。最好能写出完整的Sql语句。谢谢。
...全文
1436 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
h75xyz 2014-01-28
  • 打赏
  • 举报
回复
SELECT
	TOP 100000 --表名=case   when   a.colorder=1   then   d.name   else   ''   end,   
	--表说明=case   when   a.colorder=1   then   isnull(f.value,'')   else   ''   end,
	字段序号 = a.colorder,
	字段名 = a.name,
	字段标识 = CASE
WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity') = 1 THEN
	'√'
ELSE
	''
END,
 主键 = CASE
WHEN EXISTS (
	SELECT
		1
	FROM
		sysobjects
	WHERE
		xtype = 'PK'
	AND name IN (
		SELECT
			name
		FROM
			sysindexes
		WHERE
			indid IN (
				SELECT
					indid
				FROM
					sysindexkeys
				WHERE
					id = a.id
				AND colid = a.colid
			)
	)
) THEN
	'√'
ELSE
	''
END,
 类型 = b.name,
 占位数 = a.length,
 长度 = COLUMNPROPERTY(a.id, a.name, 'PRECISION'),
 小数位 = isnull(
	COLUMNPROPERTY(a.id, a.name, 'Scale'),
	0
),
 允许空 = CASE
WHEN a.isnullable = 1 THEN
	'√'
ELSE
	''
END,
 默认值 = isnull(e. TEXT, ''),
 字段描述 = isnull(g.[value], ''),
 所属数据表 = '[' + h.TABLE_SCHEMA + '].' + d.name,
 数据表描述 = isnull(f. VALUE, ''),
 crdate AS [创建时间],
 refdate AS [更改时间]
FROM
	syscolumns a
LEFT JOIN systypes b ON a.xtype = b.xusertype
INNER JOIN sysobjects d ON a.id = d.id
AND d.xtype IN ('U', 'V')
AND d.name <> 'dtproperties'
LEFT JOIN syscomments e ON a.cdefault = e.id
LEFT JOIN sys.extended_properties g ON a.id = g.major_id
AND a.colid = g.minor_id
LEFT JOIN sys.extended_properties f ON d.id = f.major_id
AND f.minor_id = 0
INNER JOIN (
	SELECT
		*
	FROM
		[INFORMATION_SCHEMA].[TABLES]
) h ON h.TABLE_NAME = d.name
WHERE
	h.TABLE_SCHEMA != 'Ant' --d.name = '要查询的表' --如果只查询指定表,加上此条件
ORDER BY
	[所属数据表],
	a.colorder
h75xyz 2014-01-28
  • 打赏
  • 举报
回复
这就是你要的东西
h75xyz 2014-01-28
  • 打赏
  • 举报
回复
SELECT TOP 100000 --表名=case when a.colorder=1 then d.name else '' end, --表说明=case when a.colorder=1 then isnull(f.value,'') else '' end, 字段序号 = a.colorder, 字段名 = a.name, 字段标识 = CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity') = 1 THEN '√' ELSE '' END, 主键 = CASE WHEN EXISTS ( SELECT 1 FROM sysobjects WHERE xtype = 'PK' AND name IN ( SELECT name FROM sysindexes WHERE indid IN ( SELECT indid FROM sysindexkeys WHERE id = a.id AND colid = a.colid ) ) ) THEN '√' ELSE '' END, 类型 = b.name, 占位数 = a.length, 长度 = COLUMNPROPERTY(a.id, a.name, 'PRECISION'), 小数位 = isnull( COLUMNPROPERTY(a.id, a.name, 'Scale'), 0 ), 允许空 = CASE WHEN a.isnullable = 1 THEN '√' ELSE '' END, 默认值 = isnull(e. TEXT, ''), 字段描述 = isnull(g.[value], ''), 所属数据表 = '[' + h.TABLE_SCHEMA + '].' + d.name, 数据表描述 = isnull(f. VALUE, ''), crdate AS [创建时间], refdate AS [更改时间] FROM syscolumns a LEFT JOIN systypes b ON a.xtype = b.xusertype INNER JOIN sysobjects d ON a.id = d.id AND d.xtype in ('U','V') AND d.name <> 'dtproperties' LEFT JOIN syscomments e ON a.cdefault = e.id LEFT JOIN sys.extended_properties g ON a.id = g.major_id AND a.colid = g.minor_id LEFT JOIN sys.extended_properties f ON d.id = f.major_id AND f.minor_id = 0 INNER JOIN (SELECT * FROM [INFORMATION_SCHEMA].[TABLES]) h ON h.TABLE_NAME = d.name WHERE h.TABLE_SCHEMA != 'Ant' --d.name = '要查询的表' --如果只查询指定表,加上此条件 ORDER BY [所属数据表],a.colorder
gzkvb 2012-01-17
  • 打赏
  • 举报
回复
真的没办法么,我也很想知道
荣蓝科创 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 shshjun 的回复:]
这个是没有办法用系统表解决的。原因是你可以重命名视视图中的列名,有些列是复合的或计算的,这个系统怎么能对应到具体的表呢?
[/Quote]是的,是的,结贴。
荣蓝科创 2011-11-01
  • 打赏
  • 举报
回复
貌似不可实现了,一天后结贴
shshjun 2011-11-01
  • 打赏
  • 举报
回复
这个是没有办法用系统表解决的。原因是你可以重命名视视图中的列名,有些列是复合的或计算的,这个系统怎么能对应到具体的表呢?
-晴天 2011-10-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 beifengchuiguo 的回复:]
难道这个真的没法用系统表解决???
[/Quote]
系统表记录的是一些可以规范化的信息.
视图是由SQL查询组成的,正如你写的那样,可能有各种连接,各个子句都可能有子查询,它是没办法解析到一个个规定的具体对象上的,因此,系统表中不可能记录除视图名/视图查询列等这些最基本信息外的其他信息了.甚至连它查询是基于什么表也不能规范地列出来,因为,假设你是把一个由数个表连接而获得数据集的子查询作为视图数据源的话,你让它怎么表述?
因此,对视图的分析还得从视图查询语句着手去考虑问题.
稻庄 2011-10-26
  • 打赏
  • 举报
回复
我感觉是有点抽象的
荣蓝科创 2011-10-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qianjin036a 的回复:]
引用 11 楼 beifengchuiguo 的回复:
难道这个真的没法用系统表解决???

系统表记录的是一些可以规范化的信息.
视图是由SQL查询组成的,正如你写的那样,可能有各种连接,各个子句都可能有子查询,它是没办法解析到一个个规定的具体对象上的,因此,系统表中不可能记录除视图名/视图查询列等这些最基本信息外的其他信息了.甚至连它查询是基于什么表也不能规范地列出来,因为,假设你是把……
[/Quote]嗯,确实是这样吧,就像union查询的那种,确实是没法定义哪个表的描述的。
潇洒王子 2011-10-26
  • 打赏
  • 举报
回复
确实有点难度
荣蓝科创 2011-10-25
  • 打赏
  • 举报
回复
难道这个真的没法用系统表解决???
荣蓝科创 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 geniuswjt 的回复:]
那说明视图本身写的有问题,没得偷懒
只能从源头改

引用 8 楼 beifengchuiguo 的回复:
引用 6 楼 geniuswjt 的回复:
你知道了create语句,找不出视图的列位于哪个表中这个地方?找不出他们之间的关联?
另外,你有说是多个视图?

引用 2 楼 beifengchuiguo 的回复:
引用 1 楼 geniuswjt 的回复:
sp_helpte……
[/Quote]视图没问题的,上面那个错误信息是回复5#的。带union的视图,嵌套查询的视图,没问题的,程序去处理,超级麻烦,要不然,我就不问了。
geniuswjt 2011-10-25
  • 打赏
  • 举报
回复
那说明视图本身写的有问题,没得偷懒
只能从源头改[Quote=引用 8 楼 beifengchuiguo 的回复:]
引用 6 楼 geniuswjt 的回复:
你知道了create语句,找不出视图的列位于哪个表中这个地方?找不出他们之间的关联?
另外,你有说是多个视图?

引用 2 楼 beifengchuiguo 的回复:
引用 1 楼 geniuswjt 的回复:
sp_helptext ?
查询的原始的Sql语句做什么?难道一个个去处理sql原始语句?
人工当然知道了,如果视图是多层嵌套,……
[/Quote]
荣蓝科创 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 geniuswjt 的回复:]
你知道了create语句,找不出视图的列位于哪个表中这个地方?找不出他们之间的关联?
另外,你有说是多个视图?

引用 2 楼 beifengchuiguo 的回复:
引用 1 楼 geniuswjt 的回复:
sp_helptext ?
查询的原始的Sql语句做什么?难道一个个去处理sql原始语句?
[/Quote]人工当然知道了,如果视图是多层嵌套,再加上union all,程序处理起来太麻烦了。
荣蓝科创 2011-10-25
  • 打赏
  • 举报
回复
消息 16950,级别 16,状态 2,过程 sp_MSforeach_worker,第 27 行
目前没有为变量 '@local_cursor' 分配游标。
消息 16950,级别 16,状态 2,过程 sp_MSforeach_worker,第 32 行
目前没有为变量 '@local_cursor' 分配游标。
消息 16950,级别 16,状态 2,过程 sp_MSforeach_worker,第 153 行
目前没有为变量 '@local_cursor' 分配游标。
消息 16916,级别 16,状态 1,过程 sp_MSforeach_worker,第 155 行
名为 'hCForEachDatabase' 的游标不存在。
geniuswjt 2011-10-25
  • 打赏
  • 举报
回复
你知道了create语句,找不出视图的列位于哪个表中这个地方?找不出他们之间的关联?
另外,你有说是多个视图?[Quote=引用 2 楼 beifengchuiguo 的回复:]
引用 1 楼 geniuswjt 的回复:
sp_helptext ?
查询的原始的Sql语句做什么?难道一个个去处理sql原始语句?
[/Quote]
--小F-- 2011-10-25
  • 打赏
  • 举报
回复
USE MASTER
GO
CREATE proc sp_MSforeachObject
@objectType int=1,
@command1 nvarchar(2000),
@replacechar nchar(1) = N'?',
@command2 nvarchar(2000) = null,
@command3 nvarchar(2000) = null,
@whereand nvarchar(2000) = null,
@precommand nvarchar(2000) = null,
@postcommand nvarchar(2000) = null
as
/* This proc returns one or more rows for each table (optionally, matching @where), with each table defaulting to its
own result set */
/* @precommand and @postcommand may be used to force a single result set via a temp table. */
/* Preprocessor won't replace within quotes so have to use str(). */
declare @mscat nvarchar(12)
select @mscat = ltrim(str(convert(int, 0x0002)))
if (@precommand is not null)
exec(@precommand)
/* Defined @isobject for save object type */
Declare @isobject varchar(256)
select @isobject= case @objectType when 1 then 'IsUserTable'
when 2 then 'IsView'
when 3 then 'IsTrigger'
when 4 then 'IsProcedure'
when 5 then 'IsDefault'
when 6 then 'IsForeignKey'
when 7 then 'IsScalarFunction'
when 8 then 'IsInlineFunction'
when 9 then 'IsPrimaryKey'
when 10 then 'IsExtendedProc'
when 11 then 'IsReplProc'
when 12 then 'IsRule'
end
/* Create the select */
/* Use @isobject variable isstead of IsUserTable string */
EXEC(N'declare hCForEach cursor global for select ''['' + REPLACE(user_name(uid), N'']'', N'']]'') + '']'' + ''.'' + ''['' +
REPLACE(object_name(id), N'']'', N'']]'') + '']'' from dbo.sysobjects o '
+ N' where OBJECTPROPERTY(o.id, N'''+@isobject+''') = 1 '+N' and o.category & ' + @mscat + N' = 0 '
+ @whereand)
declare @retval int
select @retval = @@error
if (@retval = 0)
exec @retval = sp_MSforeach_worker @command1, @replacechar, @command2, @command3
if (@retval = 0 and @postcommand is not null)
exec(@postcommand)
return @retval
GO

这样我们来测试一下:
--获得所有的存储过程的脚本:
EXEc sp_MSforeachObject @command1="sp_helptext '?' ",@objectType=4
--获得所有的视图的脚本:
EXEc sp_MSforeachObject @command1="sp_helptext '?' ",@objectType=2
--比如在开发过程中,没一个用户都是自己的OBJECT OWNER,所以在真实的数据库时都要改为DBO:
EXEc sp_MSforeachObject @command1="sp_changeobjectowner '?', 'dbo'",@objectType=1
EXEc sp_MSforeachObject @command1="sp_changeobjectowner '?', 'dbo'",@objectType=2
EXEc sp_MSforeachObject @command1="sp_changeobjectowner '?', 'dbo'",@objectType=3
EXEc sp_MSforeachObject @command1="sp_changeobjectowner '?', 'dbo'",@objectType=4
荣蓝科创 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ssp2009 的回复:]
select * from sys.columns where object_id=object_id('vname')
[/Quote]试过了,只能查出视图的所有列,但是查不出,这些原先在哪个表。
快溜 2011-10-25
  • 打赏
  • 举报
回复
select * from sys.columns where object_id=object_id('vname')
加载更多回复(2)

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧