代码之家  ›  专栏  ›  技术社区  ›  Bastyon

Visual Studio 2013 sql架构比较工具从何处获得视图定义

  •  2
  • Bastyon  · 技术社区  · 9 年前

    所以我试图比较我从这个位置得到的视图定义。。。

        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比较工具在何处查看,它都会获取正确的定义。

    正如您在所附图像中看到的。运行上面的两个查询,这两个查询都指向同一数据库中的相关视图,这表明视图的名称与视图定义中的视图名称不同。

    enter image description here

    但当我使用VS2013模式比较指向同一数据库时,视图定义是正确的,如果创建视图是

    enter image description here

    所以我想知道的是,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比较工具中看到了这一点。

    1 回复  |  直到 9 年前
        1
  •  3
  •   Bruce Dunwiddie    9 年前

    这是某人在您的服务器上运行的sp_rename的结果。在下面的示例中,在调用sp_rename之后,对象的名称将在sys中更改为vw_1。objects和objectexplorer,但是syscomments和sys的定义。sql_modules仍然会显示View_1。现在,如果您在对象资源管理器中右键单击对象并编写修改脚本,managementstudio将执行查找/替换并修复生成的alter脚本中的问题,这听起来就像是模式比较为您做的。

    CREATE VIEW [dbo].[View_1]
    AS
    SELECT        dbo.Table_1.*
    FROM            dbo.Table_1;
    
    select *
    from
    sys.objects
    where
    name like 'V%'
    
    select *
    from
    syscomments where text like '%View%';
    
    select *
    from
    sys.sql_modules
    where
    [definition] like '%View%';
    
    sp_rename 'View_1', 'vw_1';