所以我试图比较我从这个位置得到的视图定义。。。
Select smv.definition as VIEW_DEFINITION, v.name AS TABLE_NAME,
iv.IS_UPDATABLE FROM sys.all_views AS v JOIN sys.sql_modules AS smv ON
smv.object_id = v.object_id Join INFORMATION_SCHEMA.Views as iv
On iv.TABLE_NAME = v.name where v.name = @name
也与此位置的值进行比较
SELECT * FROM INFORMATION_SCHEMA.Views where TABLE_NAME = @name
现在为了清楚起见,我曾经从第二个位置抓取,但结果是它截断了4000个字符的定义,而第一个查询没有截断定义。。
但这两个定义(假设足够短而不截断)都匹配。但是当我进入sql模式比较工具时,该工具中显示的视图定义与存储在这些位置中的视图定义都不匹配。
举个例子。
假设视图是简单的dbo.view_test
CREATE VIEW dbo.view_test
AS
SELECT db.dbo.tbl_view_test.col1, db.dbo.tbl_view_test.col1
FROM dbo.tbl_view_test
GO
因此,假设这是visualstudio2013的sql比较输出中显示的内容,这一切看起来都很正常……但当我从上述任何一个查询中提取定义时,它看起来像这样。
CREATE VIEW dbo.vw_test
AS
SELECT db.dbo.tbl_view_test.col1, db.dbo.tbl_view_test.col1
FROM dbo.tbl_view_test
GO
因此,在视图定义的过程中,视图的某个地方出现了问题…它不应该是vw_test,它应该是view_test。
所以我想我想知道的是,模式比较工具从哪里得到它的视图定义,它与我返回的不同……以及为什么/如何使视图失去同步。因为它们不一样。数据库中的视图名为view_test,所以它的定义是如何被修改为其他内容的(vw_test),上面的两个查询显示了这一差异,但无论visualstudio中的sql比较工具在何处查看,它都会获取正确的定义。
正如您在所附图像中看到的。运行上面的两个查询,这两个查询都指向同一数据库中的相关视图,这表明视图的名称与视图定义中的视图名称不同。
但当我使用VS2013模式比较指向同一数据库时,视图定义是正确的,如果创建视图是
所以我想知道的是,VS从哪里提取视图定义,因为它与我自己查询sql时返回的视图定义不同。。
更新::现在已经尝试了以下所有sql脚本,这些脚本都是从堆栈溢出中提取的
SELECT * FROM INFORMATION_SCHEMA.Views where TABLE_NAME =
'view_disc_join_cc_info_component'
Go
Select smv.definition as VIEW_DEFINITION, v.name AS TABLE_NAME,
iv.IS_UPDATABLE FROM sys.all_views AS v JOIN sys.sql_modules
AS smv ON smv.object_id = v.object_id Join INFORMATION_SCHEMA.Views
as iv On iv.TABLE_NAME = v.name where v.name =
'view_disc_join_cc_info_component'
GO
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('dbo.view_disc_join_cc_info_component');
GO
select name, OBJECT_DEFINITION(object_id) from sys.objects where type = 'V'
and name = 'view_disc_join_cc_info_component'
GO
SELECT OBJECT_DEFINITION (OBJECT_ID('dbo.view_disc_join_cc_info_component'))
AS ObjectDefinition;
GO
select c.text from sysobjects o join syscomments c on c.id = o.id where
o.name = 'view_disc_join_cc_info_component' and o.type = 'V'
Go
上面的脚本都没有显示视图定义CreateClaus与视图名称匹配……我只在Microsoft比较工具中看到了这一点。