2013-12-03 97 views
0

这可能是一个奇怪的问题......希望有人喜欢SQL中更深奥的部分。 :)SQL查看列

我有许多列的一些意见。列宽度对查看数据有阻碍作用。一旦手动调整列宽并保存视图,该列将永久保存在该宽度处,除非手动更改并再次保存。

这让我想知道SQL如何节省列宽。是否有包含该数据的表格?如果是这样,更新的查询是否可以将给定表的所有列修改为定义的宽度?如果是这样,怎么样?

仅供参考,我的DBA和我花了很长时间试图弄清楚这一点。我不是没有先试图自己解决它。我是一名SQL新手,希望获得更多有经验的指导。

+2

这不是一个真正的SQL Server问题。你用什么程序来显示你的数据? (另外,'view'是一个特定的SQL概念,与列宽无关) – Anon

+0

我主要使用BIDS与SQL进行接口。 “视图”是查询数据的对象。我不清楚视图和查询之间的差异,但我相信视图不能改变数据。无论哪种方式,我认为这个问题适用于视图和查询。 – Uziel

回答

1

它们存储在扩展属性中。您可以在相关视图的属性窗口中查看它们,也可以通过脚本将其查看。如果编写脚本,则需要确保已选择脚本,以隐藏隐藏在高级按钮后面的扩展属性。您也可以在SSMS的选项中设置默认选项。 请注意,如果您尚未使用视图设计器,则不会有扩展属性。

0

解决方法:使用sp_refreshview(该演示展示了我改变dbo.MyTable.Col2的最大长度之后SQL Server不自动更新的元数据信息dbo.MyView,我们必须使用sp_refreshview [或ALTER VIEWDROP & CREATE]至更新元数据查看):

IF EXISTS(SELECT * FROM sys.views t WHERE t.object_id = OBJECT_ID(N'dbo.MyView')) 
BEGIN 
    DROP VIEW dbo.MyView; 
END 
IF EXISTS(SELECT * FROM sys.tables t WHERE t.object_id = OBJECT_ID(N'dbo.MyTable')) 
BEGIN 
    DROP TABLE dbo.MyTable; 
END 
CREATE TABLE dbo.MyTable 
(
    Col1 INT IDENTITY(1,1) PRIMARY KEY, 
    Col2 VARCHAR(3) NULL 
); 
GO 
CREATE VIEW dbo.MyView 
AS 
SELECT * FROM dbo.MyTable; 
GO 

SELECT cols.COLUMN_NAME, cols.DATA_TYPE, cols.CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS cols 
WHERE cols.TABLE_SCHEMA = 'dbo' 
AND  cols.TABLE_NAME = 'MyView' 
AND  cols.COLUMN_NAME = 'Col2' 
GO 
/* 
COLUMN_NAME DATA_TYPE CHARACTER_MAXIMUM_LENGTH 
----------- --------- ------------------------ 
Col2  varchar 3 
*/ 

ALTER TABLE dbo.MyTable 
ALTER COLUMN Col2 VARCHAR(10); 
GO 

SELECT cols.COLUMN_NAME, cols.DATA_TYPE, cols.CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS cols 
WHERE cols.TABLE_SCHEMA = 'dbo' 
AND  cols.TABLE_NAME = 'MyView' 
AND  cols.COLUMN_NAME = 'Col2' 
GO 
/* 
COLUMN_NAME DATA_TYPE CHARACTER_MAXIMUM_LENGTH 
----------- --------- ------------------------ 
Col2  varchar 3 
*/ 

EXEC sp_refreshview 'dbo.MyView'; 
GO 
SELECT cols.COLUMN_NAME, cols.DATA_TYPE, cols.CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS cols 
WHERE cols.TABLE_SCHEMA = 'dbo' 
AND  cols.TABLE_NAME = 'MyView' 
AND  cols.COLUMN_NAME = 'Col2' 
GO 
/* 
COLUMN_NAME DATA_TYPE CHARACTER_MAXIMUM_LENGTH 
----------- --------- ------------------------ 
Col2  varchar 10 
*/ 
+0

据我所知,'CHARACTER_MAXIMUM_LENGTH'不影响列的宽度。 --- 运行下面的查询,然后调整列宽并保存表,然后再次运行查询产生相同的结果。 SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS AS的cols WHERE(TABLE_SCHEMA = 'DBO')AND(TABLE_NAME = 'VTEST') – Uziel

+0

本演示只有SQL Server不更新dbo.MyView元数据信息时,基表(列)发生了变化。在更改了列最大长度后,您可以看到没有sp_refreshview/alter view/drop&create dbo.MyView元数据不会自动更新。如果您提供repro脚本,可能会很有用。您没有提供足够的信息来重现您的问题。你执行了sp_refreshview吗? –

+0

@Uziel:使用先前方法之一(例如sp_refresh)刷新'dbo.MyView'元数据后,您还需要刷新BIDS项目中的数据集/记录集。 –