这可能是一个奇怪的问题......希望有人喜欢SQL中更深奥的部分。 :)SQL查看列
我有许多列的一些意见。列宽度对查看数据有阻碍作用。一旦手动调整列宽并保存视图,该列将永久保存在该宽度处,除非手动更改并再次保存。
这让我想知道SQL如何节省列宽。是否有包含该数据的表格?如果是这样,更新的查询是否可以将给定表的所有列修改为定义的宽度?如果是这样,怎么样?
仅供参考,我的DBA和我花了很长时间试图弄清楚这一点。我不是没有先试图自己解决它。我是一名SQL新手,希望获得更多有经验的指导。
这可能是一个奇怪的问题......希望有人喜欢SQL中更深奥的部分。 :)SQL查看列
我有许多列的一些意见。列宽度对查看数据有阻碍作用。一旦手动调整列宽并保存视图,该列将永久保存在该宽度处,除非手动更改并再次保存。
这让我想知道SQL如何节省列宽。是否有包含该数据的表格?如果是这样,更新的查询是否可以将给定表的所有列修改为定义的宽度?如果是这样,怎么样?
仅供参考,我的DBA和我花了很长时间试图弄清楚这一点。我不是没有先试图自己解决它。我是一名SQL新手,希望获得更多有经验的指导。
它们存储在扩展属性中。您可以在相关视图的属性窗口中查看它们,也可以通过脚本将其查看。如果编写脚本,则需要确保已选择脚本,以隐藏隐藏在高级按钮后面的扩展属性。您也可以在SSMS的选项中设置默认选项。 请注意,如果您尚未使用视图设计器,则不会有扩展属性。
解决方法:使用sp_refreshview(该演示展示了我改变dbo.MyTable.Col2
的最大长度之后SQL Server不自动更新的元数据信息dbo.MyView
,我们必须使用sp_refreshview
[或ALTER VIEW
,DROP
& 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
*/
据我所知,'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
本演示只有SQL Server不更新dbo.MyView元数据信息时,基表(列)发生了变化。在更改了列最大长度后,您可以看到没有sp_refreshview/alter view/drop&create dbo.MyView元数据不会自动更新。如果您提供repro脚本,可能会很有用。您没有提供足够的信息来重现您的问题。你执行了sp_refreshview吗? –
@Uziel:使用先前方法之一(例如sp_refresh)刷新'dbo.MyView'元数据后,您还需要刷新BIDS项目中的数据集/记录集。 –
这不是一个真正的SQL Server问题。你用什么程序来显示你的数据? (另外,'view'是一个特定的SQL概念,与列宽无关) – Anon
我主要使用BIDS与SQL进行接口。 “视图”是查询数据的对象。我不清楚视图和查询之间的差异,但我相信视图不能改变数据。无论哪种方式,我认为这个问题适用于视图和查询。 – Uziel