热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> .Net编程>>正文内容

Entity Framework Code First使用者的福音 --- EF Power Tool使用记之二(问题探究)

发布时间:2011年06月14日点击数: 佚名

上次为大家介绍EF Power Tool之后,不少朋友在使用的时候碰到了一些问题曾像我提问。我自己以及同事在使用这个工具时,其实也碰到了一些问题。今天我将和大家一起分享其中2个问题以及相应的原因。

 

1. EF Power Tool帮助我们生成Code First POCO class时为何只生成了部分代码,甚至所使用的程序集都没有导入?

 

在 输入了相应的数据库Named Instance和登录信息后,EF Power Tool开始为我们创建相应的class。此时使用SQL Server Profiler同时观察SQL Server在本地的Named Instance和SQL Express Instance,我们会发现一系列数据库访问在Named Instance上执行了。

1) 首先是这样一个查询。以上篇文章中的Parent和Child类为例子,会返回这些用户级别表字段的数据。其中每个字段分别表示

C1: 每个字段在表中的序号

CatalogName: 数据库名

SchemaName:表的schema名

Name:表名

C2:字段名

C3:是否为NULL

C4:字段类型

C5:字段最大长度

C6:字段精度

C7:DateTime的精度

C8:字段刻度

C9:是否为Identity

C10:是否为数据库自动生成

C11:是否为主键

  1. SELECT  
  2. [Project6].[C2] AS [C1],  
  3. [Project6].[CatalogName] AS [CatalogName],  
  4. [Project6].[SchemaName] AS [SchemaName],  
  5. [Project6].[Name] AS [Name],  
  6. [Project6].[C1] AS [C2],  
  7. [Project6].[C3] AS [C3],  
  8. [Project6].[C4] AS [C4],  
  9. [Project6].[C5] AS [C5],  
  10. [Project6].[C6] AS [C6],  
  11. [Project6].[C7] AS [C7],  
  12. [Project6].[C8] AS [C8],  
  13. [Project6].[C9] AS [C9],  
  14. [Project6].[C10] AS [C10],  
  15. [Project6].[C11] AS [C11] 
  16. FROM ( SELECT  
  17.     [Extent1].[CatalogName] AS [CatalogName],  
  18.     [Extent1].[SchemaName] AS [SchemaName],  
  19.     [Extent1].[Name] AS [Name],  
  20.     [UnionAll1].[Name] AS [C1],  
  21.     [UnionAll1].[Ordinal] AS [C2],  
  22.     [UnionAll1].[IsNullable] AS [C3],  
  23.     [UnionAll1].[TypeName] AS [C4],  
  24.     [UnionAll1].[MaxLength] AS [C5],  
  25.     [UnionAll1].[Precision] AS [C6],  
  26.     [UnionAll1].[DateTimePrecision] AS [C7],  
  27.     [UnionAll1].[Scale] AS [C8],  
  28.     [UnionAll1].[IsIdentity] AS [C9],  
  29.     [UnionAll1].[IsStoreGenerated] AS [C10],  
  30.     CASE WHEN ([Project5].[C2] IS NULL) THEN cast(0 as bit) ELSE [Project5].[C2] END AS [C11] 
  31.     FROM   ( 
  32.         SELECT 
  33.         quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) [Id] 
  34.         ,   TABLE_CATALOG [CatalogName] 
  35.         ,   TABLE_SCHEMA [SchemaName] 
  36.         ,   TABLE_NAME    [Name] 
  37.         FROM 
  38.         INFORMATION_SCHEMA.TABLES 
  39.         WHERE 
  40.         TABLE_TYPE = 'BASE TABLE' 
  41.       ) AS [Extent1] 
  42.     INNER JOIN  (SELECT  
  43.         [Extent2].[Id] AS [Id],  
  44.         [Extent2].[Name] AS [Name],  
  45.         [Extent2].[Ordinal] AS [Ordinal],  
  46.         [Extent2].[IsNullable] AS [IsNullable],  
  47.         [Extent2].[TypeName] AS [TypeName],  
  48.         [Extent2].[MaxLength] AS [MaxLength],  
  49.         [Extent2].[Precision] AS [Precision],  
  50.         [Extent2].[DateTimePrecision] AS [DateTimePrecision],  
  51.         [Extent2].[Scale] AS [Scale],  
  52.         [Extent2].[IsIdentity] AS [IsIdentity],  
  53.         [Extent2].[IsStoreGenerated] AS [IsStoreGenerated],  
  54.         0 AS [C1],  
  55.         [Extent2].[ParentId] AS [ParentId] 
  56.         FROM ( 
  57.           SELECT 
  58.           quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id] 
  59.           ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId] 
  60.           ,   c.COLUMN_NAME   [Name] 
  61.           ,   c.ORDINAL_POSITION [Ordinal] 
  62.           ,   CAST( CASE c.IS_NULLABLE WHEN 'YES' THEN 1 WHEN 'NO' THEN 0 ELSE 0 END as bit) [IsNullable] 
  63.           ,   CASE 
  64.           WHEN c.DATA_TYPE in ('varchar''nvarchar''varbinary') and 
  65.           c.CHARACTER_MAXIMUM_LENGTH = -1 THEN 
  66.           c.DATA_TYPE + '(max)' 
  67.           ELSE 
  68.           c.DATA_TYPE 
  69.           END 
  70.           as [TypeName] 
  71.           ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength] 
  72.           ,   CAST(c.NUMERIC_PRECISION as integer) [Precision] 
  73.           ,   CAST(c.DATETIME_PRECISION as integer)[DateTimePrecision] 
  74.           ,   CAST(c.NUMERIC_SCALE as integer) [Scale] 
  75.           ,   c.COLLATION_CATALOG [CollationCatalog] 
  76.           ,   c.COLLATION_SCHEMA [CollationSchema] 
  77.           ,   c.COLLATION_NAME [CollationName] 
  78.           ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog] 
  79.           ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema] 
  80.           ,   c.CHARACTER_SET_NAME [CharacterSetName] 
  81.           ,   CAST(0 as bit) as [IsMultiSet] 
  82.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsIdentity' ) as bit) as [IsIdentity] 
  83.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsComputed' ) | CASE WHEN c.DATA_TYPE = 'timestamp' THEN 1 ELSE 0 END as bit) as [IsStoreGenerated] 
  84.           , c.COLUMN_DEFAULT as [Default] 
  85.           FROM 
  86.           INFORMATION_SCHEMA.COLUMNS c 
  87.           INNER JOIN 
  88.           INFORMATION_SCHEMA.TABLES t ON 
  89.           c.TABLE_CATALOG = t.TABLE_CATALOG AND 
  90.           c.TABLE_SCHEMA = t.TABLE_SCHEMA   AND 
  91.           c.TABLE_NAME = t.TABLE_NAME       AND 
  92.           t.TABLE_TYPE = 'BASE TABLE' 
  93.       ) AS [Extent2] 
  94.     UNION ALL 
  95.         SELECT  
  96.         [Extent3].[Id] AS [Id],  
  97.         [Extent3].[Name] AS [Name],  
  98.         [Extent3].[Ordinal] AS [Ordinal],  
  99.         [Extent3].[IsNullable] AS [IsNullable],  
  100.         [Extent3].[TypeName] AS [TypeName],  
  101.         [Extent3].[MaxLength] AS [MaxLength],  
  102.         [Extent3].[Precision] AS [Precision],  
  103.         [Extent3].[DateTimePrecision] AS [DateTimePrecision],  
  104.         [Extent3].[Scale] AS [Scale],  
  105.         [Extent3].[IsIdentity] AS [IsIdentity],  
  106.         [Extent3].[IsStoreGenerated] AS [IsStoreGenerated],  
  107.         6 AS [C1],  
  108.         [Extent3].[ParentId] AS [ParentId] 
  109.         FROM ( 
  110.           SELECT 
  111.           quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id] 
  112.           ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId] 
  113.           ,   c.COLUMN_NAME   [Name] 
  114.           ,   c.ORDINAL_POSITION [Ordinal] 
  115.           ,   CAST( CASE c.IS_NULLABLE WHEN 'YES' THEN 1 WHEN 'NO' THEN 0 ELSE 0 END as bit) [IsNullable] 
  116.           ,   CASE 
  117.           WHEN c.DATA_TYPE in ('varchar''nvarchar''varbinary') and 
  118.           c.CHARACTER_MAXIMUM_LENGTH = -1 THEN 
  119.           c.DATA_TYPE + '(max)' 
  120.           ELSE 
  121.           c.DATA_TYPE 
  122.           END 
  123.           as [TypeName] 
  124.           ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength] 
  125.           ,   CAST(c.NUMERIC_PRECISION as integer) [Precision] 
  126.           ,   CAST(c.DATETIME_PRECISION as integer) as [DateTimePrecision] 
  127.           ,   CAST(c.NUMERIC_SCALE as integer) [Scale] 
  128.           ,   c.COLLATION_CATALOG [CollationCatalog] 
  129.           ,   c.COLLATION_SCHEMA [CollationSchema] 
  130.           ,   c.COLLATION_NAME [CollationName] 
  131.           ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog] 
  132.           ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema] 
  133.           ,   c.CHARACTER_SET_NAME [CharacterSetName] 
  134.           ,   CAST(0 as bit) as [IsMultiSet] 
  135.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsIdentity' ) as bit) as [IsIdentity] 
  136.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsComputed' ) | CASE WHEN c.DATA_TYPE = 'timestamp' THEN 1 ELSE 0 END as bit) as [IsStoreGenerated] 
  137.           ,   c.COLUMN_DEFAULT [Default] 
  138.           FROM 
  139.           INFORMATION_SCHEMA.COLUMNS c 
  140.           INNER JOIN 
  141.           INFORMATION_SCHEMA.VIEWS v ON 
  142.           c.TABLE_CATALOG = v.TABLE_CATALOG AND 
  143.           c.TABLE_SCHEMA = v.TABLE_SCHEMA AND 
  144.           c.TABLE_NAME = v.TABLE_NAME 
  145.           WHERE 
  146.           NOT (v.TABLE_SCHEMA = 'dbo' 
  147.           AND v.TABLE_NAME in('syssegments''sysconstraints'
  148.           AND SUBSTRING(CAST(SERVERPROPERTY('productversion'as varchar(20)),1,1) = 8) 
  149.       ) AS [Extent3]) AS [UnionAll1] ON (0 = [UnionAll1].[C1]) AND ([Extent1].[Id] = [UnionAll1].[ParentId]) 
  150.     LEFT OUTER JOIN  (SELECT  
  151.         [UnionAll2].[Id] AS [C1],  
  152.         cast(1 as bit) AS [C2] 
  153.         FROM  ( 
  154.         SELECT 
  155.         quotename(tc.CONSTRAINT_SCHEMA) + quotename(tc.CONSTRAINT_NAME) [Id] 
  156.         , quotename(tc.TABLE_SCHEMA) + quotename(tc.TABLE_NAME) [ParentId] 
  157.         ,   tc.CONSTRAINT_NAME [Name] 
  158.         ,   tc.CONSTRAINT_TYPE [ConstraintType] 
  159.         ,   CAST(CASE tc.IS_DEFERRABLE WHEN 'NO' THEN 0 ELSE 1 END as bit) [IsDeferrable] 
  160.         ,   CAST(CASE tc.INITIALLY_DEFERRED WHEN 'NO' THEN 0 ELSE 1 END as bit) [IsInitiallyDeferred] 
  161.         FROM 
  162.         INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
  163.         WHERE tc.TABLE_NAME IS NOT NULL 
  164.       ) AS [Extent4] 
  165.         INNER JOIN  (SELECT  
  166.             7 AS [C1],  
  167.             [Extent5].[ConstraintId] AS [ConstraintId],  
  168.             [Extent6].[Id] AS [Id] 
  169.             FROM  ( 
  170.         SELECT 
  171.         quotename(CONSTRAINT_SCHEMA) + quotename(CONSTRAINT_NAME) [ConstraintId] 
  172.         ,   quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) + quotename(COLUMN_NAME) [ColumnId] 
  173.         FROM 
  174.         INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
  175.       ) AS [Extent5] 
  176.             INNER JOIN ( 
  177.           SELECT 
  178.           quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id] 
  179.           ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId] 
  180.           ,   c.COLUMN_NAME   [Name] 
  181.           ,   c.ORDINAL_POSITION [Ordinal] 
  182.           ,   CAST( CASE c.IS_NULLABLE WHEN 'YES' THEN 1 WHEN 'NO' THEN 0 ELSE 0 END as bit) [IsNullable] 
  183.           ,   CASE 
  184.           WHEN c.DATA_TYPE in ('varchar''nvarchar''varbinary') and 
  185.           c.CHARACTER_MAXIMUM_LENGTH = -1 THEN 
  186.           c.DATA_TYPE + '(max)' 
  187.           ELSE 
  188.           c.DATA_TYPE 
  189.           END 
  190.           as [TypeName] 
  191.           ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength] 
  192.           ,   CAST(c.NUMERIC_PRECISION as integer) [Precision] 
  193.           ,   CAST(c.DATETIME_PRECISION as integer)[DateTimePrecision] 
  194.           ,   CAST(c.NUMERIC_SCALE as integer) [Scale] 
  195.           ,   c.COLLATION_CATALOG [CollationCatalog] 
  196.           ,   c.COLLATION_SCHEMA [CollationSchema] 
  197.           ,   c.COLLATION_NAME [CollationName] 
  198.           ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog] 
  199.           ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema] 
  200.           ,   c.CHARACTER_SET_NAME [CharacterSetName] 
  201.           ,   CAST(0 as bit) as [IsMultiSet] 
  202.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsIdentity' ) as bit) as [IsIdentity] 
  203.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsComputed' ) | CASE WHEN c.DATA_TYPE = 'timestamp' THEN 1 ELSE 0 END as bit) as [IsStoreGenerated] 
  204.           , c.COLUMN_DEFAULT as [Default] 
  205.           FROM 
  206.           INFORMATION_SCHEMA.COLUMNS c 
  207.           INNER JOIN 
  208.           INFORMATION_SCHEMA.TABLES t ON 
  209.           c.TABLE_CATALOG = t.TABLE_CATALOG AND 
  210.           c.TABLE_SCHEMA = t.TABLE_SCHEMA   AND 
  211.           c.TABLE_NAME = t.TABLE_NAME       AND 
  212.           t.TABLE_TYPE = 'BASE TABLE' 
  213.       ) AS [Extent6] ON [Extent6].[Id] = [Extent5].[ColumnId] 
  214.         UNION ALL 
  215.             SELECT  
  216.             11 AS [C1],  
  217.             [Extent7].[ConstraintId] AS [ConstraintId],  
  218.             [Extent8].[Id] AS [Id] 
  219.             FROM  ( 
  220.         SELECT 
  221.         CAST(NULL as nvarchar(1))     [ConstraintId] 
  222.         , CAST(NULL as nvarchar(max)) [ColumnId]   
  223.         WHERE 1=2 
  224.       ) AS [Extent7] 
  225.             INNER JOIN ( 
  226.           SELECT 
  227.           quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id] 
  228.           ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId] 
  229.           ,   c.COLUMN_NAME   [Name] 
  230.           ,   c.ORDINAL_POSITION [Ordinal] 
  231.           ,   CAST( CASE c.IS_NULLABLE WHEN 'YES' THEN 1 WHEN 'NO' THEN 0 ELSE 0 END as bit) [IsNullable] 
  232.           ,   CASE 
  233.           WHEN c.DATA_TYPE in ('varchar''nvarchar''varbinary') and 
  234.           c.CHARACTER_MAXIMUM_LENGTH = -1 THEN 
  235.           c.DATA_TYPE + '(max)' 
  236.           ELSE 
  237.           c.DATA_TYPE 
  238.           END 
  239.           as [TypeName] 
  240.           ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength] 
  241.           ,   CAST(c.NUMERIC_PRECISION as integer) [Precision] 
  242.           ,   CAST(c.DATETIME_PRECISION as integer) as [DateTimePrecision] 
  243.           ,   CAST(c.NUMERIC_SCALE as integer) [Scale] 
  244.           ,   c.COLLATION_CATALOG [CollationCatalog] 
  245.           ,   c.COLLATION_SCHEMA [CollationSchema] 
  246.           ,   c.COLLATION_NAME [CollationName] 
  247.           ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog] 
  248.           ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema] 
  249.           ,   c.CHARACTER_SET_NAME [CharacterSetName] 
  250.           ,   CAST(0 as bit) as [IsMultiSet] 
  251.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsIdentity' ) as bit) as [IsIdentity] 
  252.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsComputed' ) | CASE WHEN c.DATA_TYPE = 'timestamp' THEN 1 ELSE 0 END as bit) as [IsStoreGenerated] 
  253.           ,   c.COLUMN_DEFAULT [Default] 
  254.           FROM 
  255.           INFORMATION_SCHEMA.COLUMNS c 
  256.           INNER JOIN 
  257.           INFORMATION_SCHEMA.VIEWS v ON 
  258.           c.TABLE_CATALOG = v.TABLE_CATALOG AND 
  259.           c.TABLE_SCHEMA = v.TABLE_SCHEMA AND 
  260.           c.TABLE_NAME = v.TABLE_NAME 
  261.           WHERE 
  262.           NOT (v.TABLE_SCHEMA = 'dbo' 
  263.           AND v.TABLE_NAME in('syssegments''sysconstraints'
  264.           AND SUBSTRING(CAST(SERVERPROPERTY('productversion'as varchar(20)),1,1) = 8) 
  265.       ) AS [Extent8] ON [Extent8].[Id] = [Extent7].[ColumnId]) AS [UnionAll2] ON (7 = [UnionAll2].[C1]) AND ([Extent4].[Id] = [UnionAll2].[ConstraintId]) 
  266.         WHERE [Extent4].[ConstraintType] = 'PRIMARY KEY' ) AS [Project5] ON [UnionAll1].[Id] = [Project5].[C1] 
  267. )  AS [Project6] 
  268. ORDER BY [Project6].[SchemaName] ASC, [Project6].[Name] ASC, [Project6].[C2] ASC 

2) 然后这个查询返回系统级表的字段信息。

  1. ELECT  
  2. [Project6].[C2] AS [C1],  
  3. [Project6].[CatalogName] AS [CatalogName],  
  4. [Project6].[SchemaName] AS [SchemaName],  
  5. [Project6].[NameAS [Name],  
  6. [Project6].[C1] AS [C2],  
  7. [Project6].[C3] AS [C3],  
  8. [Project6].[C4] AS [C4],  
  9. [Project6].[C5] AS [C5],  
  10. [Project6].[C6] AS [C6],  
  11. [Project6].[C7] AS [C7],  
  12. [Project6].[C8] AS [C8],  
  13. [Project6].[C9] AS [C9],  
  14. [Project6].[C10] AS [C10],  
  15. [Project6].[C11] AS [C11] 
  16. FROM ( SELECT  
  17.     [Extent1].[CatalogName] AS [CatalogName],  
  18.     [Extent1].[SchemaName] AS [SchemaName],  
  19.     [Extent1].[NameAS [Name],  
  20.     [UnionAll1].[NameAS [C1],  
  21.     [UnionAll1].[Ordinal] AS [C2],  
  22.     [UnionAll1].[IsNullable] AS [C3],  
  23.     [UnionAll1].[TypeName] AS [C4],  
  24.     [UnionAll1].[MaxLength] AS [C5],  
  25.     [UnionAll1].[PrecisionAS [C6],  
  26.     [UnionAll1].[DateTimePrecision] AS [C7],  
  27.     [UnionAll1].[Scale] AS [C8],  
  28.     [UnionAll1].[IsIdentity] AS [C9],  
  29.     [UnionAll1].[IsStoreGenerated] AS [C10],  
  30.     CASE WHEN ([Project5].[C2] IS NULLTHEN cast(0 as bitELSE [Project5].[C2] END AS [C11] 
  31.     FROM   ( 
  32.         SELECT 
  33.         quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) [Id] 
  34.         ,   TABLE_CATALOG             [CatalogName] 
  35.         ,   TABLE_SCHEMA              [SchemaName] 
  36.         ,   TABLE_NAME                [Name
  37.         ,   VIEW_DEFINITION           [ViewDefinition] 
  38.         ,   CASTCASE IS_UPDATABLE WHEN 'YES' THEN 1 WHEN 'NO' THEN 0 ELSE 0 END as bit) [IsUpdatable] 
  39.         FROM 
  40.         INFORMATION_SCHEMA.VIEWS 
  41.         WHERE 
  42.         NOT (TABLE_SCHEMA = 'dbo' 
  43.         AND TABLE_NAME in('syssegments''sysconstraints'
  44.         AND SUBSTRING(CAST(SERVERPROPERTY('productversion'as varchar(20)),1,1) = 8) 
  45.       ) AS [Extent1] 
  46.     INNER JOIN  (SELECT  
  47.         [Extent2].[Id] AS [Id],  
  48.         [Extent2].[NameAS [Name],  
  49.         [Extent2].[Ordinal] AS [Ordinal],  
  50.         [Extent2].[IsNullable] AS [IsNullable],  
  51.         [Extent2].[TypeName] AS [TypeName],  
  52.         [Extent2].[MaxLength] AS [MaxLength],  
  53.         [Extent2].[PrecisionAS [Precision],  
  54.         [Extent2].[DateTimePrecision] AS [DateTimePrecision],  
  55.         [Extent2].[Scale] AS [Scale],  
  56.         [Extent2].[IsIdentity] AS [IsIdentity],  
  57.         [Extent2].[IsStoreGenerated] AS [IsStoreGenerated],  
  58.         4 AS [C1],  
  59.         [Extent2].[ParentId] AS [ParentId] 
  60.         FROM ( 
  61.           SELECT 
  62.           quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id] 
  63.           ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId] 
  64.           ,   c.COLUMN_NAME   [Name
  65.           ,   c.ORDINAL_POSITION [Ordinal] 
  66.           ,   CASTCASE c.IS_NULLABLE WHEN 'YES' THEN 1 WHEN 'NO' THEN 0 ELSE 0 END as bit) [IsNullable] 
  67.           ,   CASE 
  68.           WHEN c.DATA_TYPE in ('varchar''nvarchar''varbinary'and 
  69.           c.CHARACTER_MAXIMUM_LENGTH = -1 THEN 
  70.           c.DATA_TYPE + '(max)' 
  71.           ELSE 
  72.           c.DATA_TYPE 
  73.           END 
  74.           as [TypeName] 
  75.           ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength] 
  76.           ,   CAST(c.NUMERIC_PRECISION as integer) [Precision
  77.           ,   CAST(c.DATETIME_PRECISION as integer)[DateTimePrecision] 
  78.           ,   CAST(c.NUMERIC_SCALE as integer) [Scale] 
  79.           ,   c.COLLATION_CATALOG [CollationCatalog] 
  80.           ,   c.COLLATION_SCHEMA [CollationSchema] 
  81.           ,   c.COLLATION_NAME [CollationName] 
  82.           ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog] 
  83.           ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema] 
  84.           ,   c.CHARACTER_SET_NAME [CharacterSetName] 
  85.           ,   CAST(0 as bitas [IsMultiSet] 
  86.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsIdentity' ) as bitas [IsIdentity] 
  87.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsComputed' ) | CASE WHEN c.DATA_TYPE = 'timestamp' THEN 1 ELSE 0 END as bitas [IsStoreGenerated] 
  88.           , c.COLUMN_DEFAULT as [Default
  89.           FROM 
  90.           INFORMATION_SCHEMA.COLUMNS c 
  91.           INNER JOIN 
  92.           INFORMATION_SCHEMA.TABLES t ON 
  93.           c.TABLE_CATALOG = t.TABLE_CATALOG AND 
  94.           c.TABLE_SCHEMA = t.TABLE_SCHEMA   AND 
  95.           c.TABLE_NAME = t.TABLE_NAME       AND 
  96.           t.TABLE_TYPE = 'BASE TABLE' 
  97.       ) AS [Extent2] 
  98.     UNION ALL 
  99.         SELECT  
  100.         [Extent3].[Id] AS [Id],  
  101.         [Extent3].[NameAS [Name],  
  102.         [Extent3].[Ordinal] AS [Ordinal],  
  103.         [Extent3].[IsNullable] AS [IsNullable],  
  104.         [Extent3].[TypeName] AS [TypeName],  
  105.         [Extent3].[MaxLength] AS [MaxLength],  
  106.         [Extent3].[PrecisionAS [Precision],  
  107.         [Extent3].[DateTimePrecision] AS [DateTimePrecision],  
  108.         [Extent3].[Scale] AS [Scale],  
  109.         [Extent3].[IsIdentity] AS [IsIdentity],  
  110.         [Extent3].[IsStoreGenerated] AS [IsStoreGenerated],  
  111.         0 AS [C1],  
  112.         [Extent3].[ParentId] AS [ParentId] 
  113.         FROM ( 
  114.           SELECT 
  115.           quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id] 
  116.           ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId] 
  117.           ,   c.COLUMN_NAME   [Name
  118.           ,   c.ORDINAL_POSITION [Ordinal] 
  119.           ,   CASTCASE c.IS_NULLABLE WHEN 'YES' THEN 1 WHEN 'NO' THEN 0 ELSE 0 END as bit) [IsNullable] 
  120.           ,   CASE 
  121.           WHEN c.DATA_TYPE in ('varchar''nvarchar''varbinary'and 
  122.           c.CHARACTER_MAXIMUM_LENGTH = -1 THEN 
  123.           c.DATA_TYPE + '(max)' 
  124.           ELSE 
  125.           c.DATA_TYPE 
  126.           END 
  127.           as [TypeName] 
  128.           ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength] 
  129.           ,   CAST(c.NUMERIC_PRECISION as integer) [Precision
  130.           ,   CAST(c.DATETIME_PRECISION as integeras [DateTimePrecision] 
  131.           ,   CAST(c.NUMERIC_SCALE as integer) [Scale] 
  132.           ,   c.COLLATION_CATALOG [CollationCatalog] 
  133.           ,   c.COLLATION_SCHEMA [CollationSchema] 
  134.           ,   c.COLLATION_NAME [CollationName] 
  135.           ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog] 
  136.           ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema] 
  137.           ,   c.CHARACTER_SET_NAME [CharacterSetName] 
  138.           ,   CAST(0 as bitas [IsMultiSet] 
  139.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsIdentity' ) as bitas [IsIdentity] 
  140.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsComputed' ) | CASE WHEN c.DATA_TYPE = 'timestamp' THEN 1 ELSE 0 END as bitas [IsStoreGenerated] 
  141.           ,   c.COLUMN_DEFAULT [Default
  142.           FROM 
  143.           INFORMATION_SCHEMA.COLUMNS c 
  144.           INNER JOIN 
  145.           INFORMATION_SCHEMA.VIEWS v ON 
  146.           c.TABLE_CATALOG = v.TABLE_CATALOG AND 
  147.           c.TABLE_SCHEMA = v.TABLE_SCHEMA AND 
  148.           c.TABLE_NAME = v.TABLE_NAME 
  149.           WHERE 
  150.           NOT (v.TABLE_SCHEMA = 'dbo' 
  151.           AND v.TABLE_NAME in('syssegments''sysconstraints'
  152.           AND SUBSTRING(CAST(SERVERPROPERTY('productversion'as varchar(20)),1,1) = 8) 
  153.       ) AS [Extent3]) AS [UnionAll1] ON (0 = [UnionAll1].[C1]) AND ([Extent1].[Id] = [UnionAll1].[ParentId]) 
  154.     LEFT OUTER JOIN  (SELECT  
  155.         [UnionAll2].[Id] AS [C1],  
  156.         cast(1 as bitAS [C2] 
  157.         FROM  ( 
  158.         SELECT 
  159.         CAST(NULL as nvarchar(1))   [Id] 
  160.         , CAST(NULL as nvarchar(256)) [ParentId] 
  161.         , CAST(NULL as nvarchar(256)) [Name
  162.         , CAST(NULL as nvarchar(256)) [ConstraintType] 
  163.         , CAST(0 as bit) [IsDeferrable] 
  164.         , CAST(0 as bit) [IsInitiallyDeferred] 
  165.         , CAST(NULL as nvarchar(max)) [Expression] 
  166.         , CAST(NULL as nvarchar(11))  [UpdateRule] 
  167.         , CAST(NULL as nvarchar(11))  [DeleteRule] 
  168.         WHERE 1=2 
  169.       ) AS [Extent4] 
  170.         INNER JOIN  (SELECT  
  171.             10 AS [C1],  
  172.             [Extent5].[ConstraintId] AS [ConstraintId],  
  173.             [Extent6].[Id] AS [Id] 
  174.             FROM  ( 
  175.         SELECT 
  176.         quotename(CONSTRAINT_SCHEMA) + quotename(CONSTRAINT_NAME) [ConstraintId] 
  177.         ,   quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) + quotename(COLUMN_NAME) [ColumnId] 
  178.         FROM 
  179.         INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
  180.       ) AS [Extent5] 
  181.             INNER JOIN ( 
  182.           SELECT 
  183.           quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id] 
  184.           ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId] 
  185.           ,   c.COLUMN_NAME   [Name
  186.           ,   c.ORDINAL_POSITION [Ordinal] 
  187.           ,   CASTCASE c.IS_NULLABLE WHEN 'YES' THEN 1 WHEN 'NO' THEN 0 ELSE 0 END as bit) [IsNullable] 
  188.           ,   CASE 
  189.           WHEN c.DATA_TYPE in ('varchar''nvarchar''varbinary'and 
  190.           c.CHARACTER_MAXIMUM_LENGTH = -1 THEN 
  191.           c.DATA_TYPE + '(max)' 
  192.           ELSE 
  193.           c.DATA_TYPE 
  194.           END 
  195.           as [TypeName] 
  196.           ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength] 
  197.           ,   CAST(c.NUMERIC_PRECISION as integer) [Precision
  198.           ,   CAST(c.DATETIME_PRECISION as integer)[DateTimePrecision] 
  199.           ,   CAST(c.NUMERIC_SCALE as integer) [Scale] 
  200.           ,   c.COLLATION_CATALOG [CollationCatalog] 
  201.           ,   c.COLLATION_SCHEMA [CollationSchema] 
  202.           ,   c.COLLATION_NAME [CollationName] 
  203.           ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog] 
  204.           ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema] 
  205.           ,   c.CHARACTER_SET_NAME [CharacterSetName] 
  206.           ,   CAST(0 as bitas [IsMultiSet] 
  207.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsIdentity' ) as bitas [IsIdentity] 
  208.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsComputed' ) | CASE WHEN c.DATA_TYPE = 'timestamp' THEN 1 ELSE 0 END as bitas [IsStoreGenerated] 
  209.           , c.COLUMN_DEFAULT as [Default
  210.           FROM 
  211.           INFORMATION_SCHEMA.COLUMNS c 
  212.           INNER JOIN 
  213.           INFORMATION_SCHEMA.TABLES t ON 
  214.           c.TABLE_CATALOG = t.TABLE_CATALOG AND 
  215.           c.TABLE_SCHEMA = t.TABLE_SCHEMA   AND 
  216.           c.TABLE_NAME = t.TABLE_NAME       AND 
  217.           t.TABLE_TYPE = 'BASE TABLE' 
  218.       ) AS [Extent6] ON [Extent6].[Id] = [Extent5].[ColumnId] 
  219.         UNION ALL 
  220.             SELECT  
  221.             7 AS [C1],  
  222.             [Extent7].[ConstraintId] AS [ConstraintId],  
  223.             [Extent8].[Id] AS [Id] 
  224.             FROM  ( 
  225.         SELECT 
  226.         CAST(NULL as nvarchar(1))     [ConstraintId] 
  227.         , CAST(NULL as nvarchar(max)) [ColumnId]   
  228.         WHERE 1=2 
  229.       ) AS [Extent7] 
  230.             INNER JOIN ( 
  231.           SELECT 
  232.           quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id] 
  233.           ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId] 
  234.           ,   c.COLUMN_NAME   [Name
  235.           ,   c.ORDINAL_POSITION [Ordinal] 
  236.           ,   CASTCASE c.IS_NULLABLE WHEN 'YES' THEN 1 WHEN 'NO' THEN 0 ELSE 0 END as bit) [IsNullable] 
  237.           ,   CASE 
  238.           WHEN c.DATA_TYPE in ('varchar''nvarchar''varbinary'and 
  239.           c.CHARACTER_MAXIMUM_LENGTH = -1 THEN 
  240.           c.DATA_TYPE + '(max)' 
  241.           ELSE 
  242.           c.DATA_TYPE 
  243.           END 
  244.           as [TypeName] 
  245.           ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength] 
  246.           ,   CAST(c.NUMERIC_PRECISION as integer) [Precision
  247.           ,   CAST(c.DATETIME_PRECISION as integeras [DateTimePrecision] 
  248.           ,   CAST(c.NUMERIC_SCALE as integer) [Scale] 
  249.           ,   c.COLLATION_CATALOG [CollationCatalog] 
  250.           ,   c.COLLATION_SCHEMA [CollationSchema] 
  251.           ,   c.COLLATION_NAME [CollationName] 
  252.           ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog] 
  253.           ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema] 
  254.           ,   c.CHARACTER_SET_NAME [CharacterSetName] 
  255.           ,   CAST(0 as bitas [IsMultiSet] 
  256.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsIdentity' ) as bitas [IsIdentity] 
  257.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsComputed' ) | CASE WHEN c.DATA_TYPE = 'timestamp' THEN 1 ELSE 0 END as bitas [IsStoreGenerated] 
  258.           ,   c.COLUMN_DEFAULT [Default
  259.           FROM 
  260.           INFORMATION_SCHEMA.COLUMNS c 
  261.           INNER JOIN 
  262.           INFORMATION_SCHEMA.VIEWS v ON 
  263.           c.TABLE_CATALOG = v.TABLE_CATALOG AND 
  264.           c.TABLE_SCHEMA = v.TABLE_SCHEMA AND 
  265.           c.TABLE_NAME = v.TABLE_NAME 
  266.           WHERE 
  267.           NOT (v.TABLE_SCHEMA = 'dbo' 
  268.           AND v.TABLE_NAME in('syssegments''sysconstraints'
  269.           AND SUBSTRING(CAST(SERVERPROPERTY('productversion'as varchar(20)),1,1) = 8) 
  270.       ) AS [Extent8] ON [Extent8].[Id] = [Extent7].[ColumnId]) AS [UnionAll2] ON (7 = [UnionAll2].[C1]) AND ([Extent4].[Id] = [UnionAll2].[ConstraintId]) 
  271.         WHERE [Extent4].[ConstraintType] = 'PRIMARY KEY' ) AS [Project5] ON [UnionAll1].[Id] = [Project5].[C1] 
  272. )  AS [Project6] 
  273. ORDER BY [Project6].[SchemaName] ASC, [Project6].[NameASC, [Project6].[C2] ASC 

3) 此查询返回数据库中所有的外键关系。以Parent和Child为例子,返回这样一个表格:

  1. SELECT  
  2. [Project11].[C1] AS [C1],  
  3. [Project11].[C5] AS [C2],  
  4. [Project11].[C6] AS [C3],  
  5. [Project11].[C4] AS [C4],  
  6. [Project11].[C2] AS [C5],  
  7. [Project11].[C8] AS [C6],  
  8. [Project11].[C9] AS [C7],  
  9. [Project11].[C7] AS [C8],  
  10. [Project11].[C3] AS [C9],  
  11. [Project11].[NameAS [Name],  
  12. [Project11].[Id] AS [Id],  
  13. [Project11].[C10] AS [C10] 
  14. FROM ( SELECT  
  15.     [Extent1].[Id] AS [Id],  
  16.     [Extent2].[NameAS [Name],  
  17.     [Join5].[Ordinal] AS [C1],  
  18.     [Join5].[Name1] AS [C2],  
  19.     [Join5].[Name2] AS [C3],  
  20.     [UnionAll4].[NameAS [C4],  
  21.     [UnionAll4].[CatalogName] AS [C5],  
  22.     [UnionAll4].[SchemaName] AS [C6],  
  23.     [UnionAll5].[NameAS [C7],  
  24.     [UnionAll5].[CatalogName] AS [C8],  
  25.     [UnionAll5].[SchemaName] AS [C9],  
  26.     CASE WHEN ([Extent1].[DeleteRule] = 'CASCADE'THEN cast(1 as bitWHEN ([Extent1].[DeleteRule] <> 'CASCADE'THEN cast(0 as bitEND AS [C10] 
  27.     FROM     ( 
  28.         SELECT 
  29.         quotename(rc.CONSTRAINT_SCHEMA) + quotename(rc.CONSTRAINT_NAME) [Id] 
  30.         , CAST(rc.UPDATE_RULE as nvarchar(11)) [UpdateRule] 
  31.         , CAST(rc.DELETE_RULE as nvarchar(11)) [DeleteRule] 
  32.         FROM 
  33.         INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc 
  34.       ) AS [Extent1] 
  35.     INNER JOIN ( 
  36.         SELECT 
  37.         quotename(tc.CONSTRAINT_SCHEMA) + quotename(tc.CONSTRAINT_NAME) [Id] 
  38.         , quotename(tc.TABLE_SCHEMA) + quotename(tc.TABLE_NAME) [ParentId] 
  39.         ,   tc.CONSTRAINT_NAME [Name
  40.         ,   tc.CONSTRAINT_TYPE [ConstraintType] 
  41.         ,   CAST(CASE tc.IS_DEFERRABLE WHEN 'NO' THEN 0 ELSE 1 END as bit) [IsDeferrable] 
  42.         ,   CAST(CASE tc.INITIALLY_DEFERRED WHEN 'NO' THEN 0 ELSE 1 END as bit) [IsInitiallyDeferred] 
  43.         FROM 
  44.         INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
  45.         WHERE tc.TABLE_NAME IS NOT NULL 
  46.       ) AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id] 
  47.     INNER JOIN  (SELECT [UnionAll1].[Ordinal] AS [Ordinal], [UnionAll1].[C1] AS [C11], [UnionAll1].[ConstraintId] AS [ConstraintId], [Join2].[Id1], [UnionAll2].[NameAS [Name1], [UnionAll2].[C2] AS [C21], [UnionAll2].[ParentId] AS [ParentId1], [UnionAll3].[NameAS [Name2] 
  48.         FROM     (SELECT  
  49.             [Extent3].[Ordinal] AS [Ordinal],  
  50.             0 AS [C1],  
  51.             [Extent3].[ConstraintId] AS [ConstraintId],  
  52.             6 AS [C2],  
  53.             [Extent3].[FromColumnId] AS [FromColumnId],  
  54.             6 AS [C3],  
  55.             [Extent3].[ToColumnId] AS [ToColumnId] 
  56.             FROM ( 
  57.         SELECT 
  58.         quotename(FC.CONSTRAINT_SCHEMA) + quotename(FC.CONSTRAINT_NAME) + quotename(cast(FC.ORDINAL_POSITION as nvarchar(30))) [Id] 
  59.         ,   quotename(PC.TABLE_SCHEMA) + quotename(PC.TABLE_NAME) + quotename(PC.COLUMN_NAME) [ToColumnId] 
  60.         ,   quotename(FC.TABLE_SCHEMA) + quotename(FC.TABLE_NAME) + quotename(FC.COLUMN_NAME) [FromColumnId] 
  61.         ,   quotename(FC.CONSTRAINT_SCHEMA) + quotename(FC.CONSTRAINT_NAME) [ConstraintId] 
  62.         ,   FC.ORDINAL_POSITION [Ordinal] 
  63.         FROM 
  64.         INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC 
  65.         INNER JOIN 
  66.         INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS PC /* PRIMARY KEY COLS*/ 
  67.         ON       RC.UNIQUE_CONSTRAINT_SCHEMA = PC.CONSTRAINT_SCHEMA 
  68.         AND      RC.UNIQUE_CONSTRAINT_NAME    = PC.CONSTRAINT_NAME 
  69.         INNER JOIN 
  70.         INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS FC /* FOREIGN KEY COLS*/ 
  71.         ON       RC.CONSTRAINT_SCHEMA = FC.CONSTRAINT_SCHEMA 
  72.         AND      RC.CONSTRAINT_NAME    = FC.CONSTRAINT_NAME 
  73.         AND      PC.ORDINAL_POSITION = FC.ORDINAL_POSITION 
  74.       ) AS [Extent3] 
  75.         UNION ALL 
  76.             SELECT  
  77.             [Extent4].[Ordinal] AS [Ordinal],  
  78.             9 AS [C1],  
  79.             [Extent4].[ConstraintId] AS [ConstraintId],  
  80.             10 AS [C2],  
  81.             [Extent4].[FromColumnId] AS [FromColumnId],  
  82.             10 AS [C3],  
  83.             [Extent4].[ToColumnId] AS [ToColumnId] 
  84.             FROM ( 
  85.         SELECT 
  86.         CAST(NULL as nvarchar(1))    [Id] 
  87.         ,  CAST(NULL as nvarchar(max)) [ToColumnId] 
  88.         ,  CAST(NULL as nvarchar(max)) [FromColumnId] 
  89.         ,  CAST(NULL as nvarchar(1))   [ConstraintId] 
  90.         ,  0 [Ordinal] 
  91.         WHERE 1=2 
  92.       ) AS [Extent4]) AS [UnionAll1] 
  93.         INNER JOIN  (SELECT [Extent5].[Id] AS [Id1] 
  94.             FROM  ( 
  95.         SELECT 
  96.         quotename(rc.CONSTRAINT_SCHEMA) + quotename(rc.CONSTRAINT_NAME) [Id] 
  97.         , CAST(rc.UPDATE_RULE as nvarchar(11)) [UpdateRule] 
  98.         , CAST(rc.DELETE_RULE as nvarchar(11)) [DeleteRule] 
  99.         FROM 
  100.         INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc 
  101.       ) AS [Extent5] 
  102.             INNER JOIN ( 
  103.         SELECT 
  104.         quotename(tc.CONSTRAINT_SCHEMA) + quotename(tc.CONSTRAINT_NAME) [Id] 
  105.         , quotename(tc.TABLE_SCHEMA) + quotename(tc.TABLE_NAME) [ParentId] 
  106.         ,   tc.CONSTRAINT_NAME [Name
  107.         ,   tc.CONSTRAINT_TYPE [ConstraintType] 
  108.         ,   CAST(CASE tc.IS_DEFERRABLE WHEN 'NO' THEN 0 ELSE 1 END as bit) [IsDeferrable] 
  109.         ,   CAST(CASE tc.INITIALLY_DEFERRED WHEN 'NO' THEN 0 ELSE 1 END as bit) [IsInitiallyDeferred] 
  110.         FROM 
  111.         INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
  112.         WHERE tc.TABLE_NAME IS NOT NULL 
  113.       ) AS [Extent6] ON [Extent5].[Id] = [Extent6].[Id] ) AS [Join2] ON ([UnionAll1].[C1] = 0) AND ([UnionAll1].[ConstraintId] = [Join2].[Id1]) 
  114.         LEFT OUTER JOIN  (SELECT  
  115.             6 AS [C1],  
  116.             [Extent7].[Id] AS [Id],  
  117.             [Extent7].[NameAS [Name],  
  118.             3 AS [C2],  
  119.             [Extent7].[ParentId] AS [ParentId] 
  120.             FROM ( 
  121.           SELECT 
  122.           quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id] 
  123.           ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId] 
  124.           ,   c.COLUMN_NAME   [Name
  125.           ,   c.ORDINAL_POSITION [Ordinal] 
  126.           ,   CASTCASE c.IS_NULLABLE WHEN 'YES' THEN 1 WHEN 'NO' THEN 0 ELSE 0 END as bit) [IsNullable] 
  127.           ,   CASE 
  128.           WHEN c.DATA_TYPE in ('varchar''nvarchar''varbinary'and 
  129.           c.CHARACTER_MAXIMUM_LENGTH = -1 THEN 
  130.           c.DATA_TYPE + '(max)' 
  131.           ELSE 
  132.           c.DATA_TYPE 
  133.           END 
  134.           as [TypeName] 
  135.           ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength] 
  136.           ,   CAST(c.NUMERIC_PRECISION as integer) [Precision
  137.           ,   CAST(c.DATETIME_PRECISION as integer)[DateTimePrecision] 
  138.           ,   CAST(c.NUMERIC_SCALE as integer) [Scale] 
  139.           ,   c.COLLATION_CATALOG [CollationCatalog] 
  140.           ,   c.COLLATION_SCHEMA [CollationSchema] 
  141.           ,   c.COLLATION_NAME [CollationName] 
  142.           ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog] 
  143.           ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema] 
  144.           ,   c.CHARACTER_SET_NAME [CharacterSetName] 
  145.           ,   CAST(0 as bitas [IsMultiSet] 
  146.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsIdentity' ) as bitas [IsIdentity] 
  147.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsComputed' ) | CASE WHEN c.DATA_TYPE = 'timestamp' THEN 1 ELSE 0 END as bitas [IsStoreGenerated] 
  148.           , c.COLUMN_DEFAULT as [Default
  149.           FROM 
  150.           INFORMATION_SCHEMA.COLUMNS c 
  151.           INNER JOIN 
  152.           INFORMATION_SCHEMA.TABLES t ON 
  153.           c.TABLE_CATALOG = t.TABLE_CATALOG AND 
  154.           c.TABLE_SCHEMA = t.TABLE_SCHEMA   AND 
  155.           c.TABLE_NAME = t.TABLE_NAME       AND 
  156.           t.TABLE_TYPE = 'BASE TABLE' 
  157.       ) AS [Extent7] 
  158.         UNION ALL 
  159.             SELECT  
  160.             10 AS [C1],  
  161.             [Extent8].[Id] AS [Id],  
  162.             [Extent8].[NameAS [Name],  
  163.             12 AS [C2],  
  164.             [Extent8].[ParentId] AS [ParentId] 
  165.             FROM ( 
  166.           SELECT 
  167.           quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id] 
  168.           ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId] 
  169.           ,   c.COLUMN_NAME   [Name
  170.           ,   c.ORDINAL_POSITION [Ordinal] 
  171.           ,   CASTCASE c.IS_NULLABLE WHEN 'YES' THEN 1 WHEN 'NO' THEN 0 ELSE 0 END as bit) [IsNullable] 
  172.           ,   CASE 
  173.           WHEN c.DATA_TYPE in ('varchar''nvarchar''varbinary'and 
  174.           c.CHARACTER_MAXIMUM_LENGTH = -1 THEN 
  175.           c.DATA_TYPE + '(max)' 
  176.           ELSE 
  177.           c.DATA_TYPE 
  178.           END 
  179.           as [TypeName] 
  180.           ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength] 
  181.           ,   CAST(c.NUMERIC_PRECISION as integer) [Precision
  182.           ,   CAST(c.DATETIME_PRECISION as integeras [DateTimePrecision] 
  183.           ,   CAST(c.NUMERIC_SCALE as integer) [Scale] 
  184.           ,   c.COLLATION_CATALOG [CollationCatalog] 
  185.           ,   c.COLLATION_SCHEMA [CollationSchema] 
  186.           ,   c.COLLATION_NAME [CollationName] 
  187.           ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog] 
  188.           ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema] 
  189.           ,   c.CHARACTER_SET_NAME [CharacterSetName] 
  190.           ,   CAST(0 as bitas [IsMultiSet] 
  191.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsIdentity' ) as bitas [IsIdentity] 
  192.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsComputed' ) | CASE WHEN c.DATA_TYPE = 'timestamp' THEN 1 ELSE 0 END as bitas [IsStoreGenerated] 
  193.           ,   c.COLUMN_DEFAULT [Default
  194.           FROM 
  195.           INFORMATION_SCHEMA.COLUMNS c 
  196.           INNER JOIN 
  197.           INFORMATION_SCHEMA.VIEWS v ON 
  198.           c.TABLE_CATALOG = v.TABLE_CATALOG AND 
  199.           c.TABLE_SCHEMA = v.TABLE_SCHEMA AND 
  200.           c.TABLE_NAME = v.TABLE_NAME 
  201.           WHERE 
  202.           NOT (v.TABLE_SCHEMA = 'dbo' 
  203.           AND v.TABLE_NAME in('syssegments''sysconstraints'
  204.           AND SUBSTRING(CAST(SERVERPROPERTY('productversion'as varchar(20)),1,1) = 8) 
  205.       ) AS [Extent8]) AS [UnionAll2] ON ([UnionAll1].[C3] = [UnionAll2].[C1]) AND ([UnionAll1].[ToColumnId] = [UnionAll2].[Id]) 
  206.         LEFT OUTER JOIN  (SELECT  
  207.             6 AS [C1],  
  208.             [Extent9].[Id] AS [Id],  
  209.             [Extent9].[NameAS [Name
  210.             FROM ( 
  211.           SELECT 
  212.           quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id] 
  213.           ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId] 
  214.           ,   c.COLUMN_NAME   [Name
  215.           ,   c.ORDINAL_POSITION [Ordinal] 
  216.           ,   CASTCASE c.IS_NULLABLE WHEN 'YES' THEN 1 WHEN 'NO' THEN 0 ELSE 0 END as bit) [IsNullable] 
  217.           ,   CASE 
  218.           WHEN c.DATA_TYPE in ('varchar''nvarchar''varbinary'and 
  219.           c.CHARACTER_MAXIMUM_LENGTH = -1 THEN 
  220.           c.DATA_TYPE + '(max)' 
  221.           ELSE 
  222.           c.DATA_TYPE 
  223.           END 
  224.           as [TypeName] 
  225.           ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength] 
  226.           ,   CAST(c.NUMERIC_PRECISION as integer) [Precision
  227.           ,   CAST(c.DATETIME_PRECISION as integer)[DateTimePrecision] 
  228.           ,   CAST(c.NUMERIC_SCALE as integer) [Scale] 
  229.           ,   c.COLLATION_CATALOG [CollationCatalog] 
  230.           ,   c.COLLATION_SCHEMA [CollationSchema] 
  231.           ,   c.COLLATION_NAME [CollationName] 
  232.           ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog] 
  233.           ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema] 
  234.           ,   c.CHARACTER_SET_NAME [CharacterSetName] 
  235.           ,   CAST(0 as bitas [IsMultiSet] 
  236.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsIdentity' ) as bitas [IsIdentity] 
  237.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsComputed' ) | CASE WHEN c.DATA_TYPE = 'timestamp' THEN 1 ELSE 0 END as bitas [IsStoreGenerated] 
  238.           , c.COLUMN_DEFAULT as [Default
  239.           FROM 
  240.           INFORMATION_SCHEMA.COLUMNS c 
  241.           INNER JOIN 
  242.           INFORMATION_SCHEMA.TABLES t ON 
  243.           c.TABLE_CATALOG = t.TABLE_CATALOG AND 
  244.           c.TABLE_SCHEMA = t.TABLE_SCHEMA   AND 
  245.           c.TABLE_NAME = t.TABLE_NAME       AND 
  246.           t.TABLE_TYPE = 'BASE TABLE' 
  247.       ) AS [Extent9] 
  248.         UNION ALL 
  249.             SELECT  
  250.             10 AS [C1],  
  251.             [Extent10].[Id] AS [Id],  
  252.             [Extent10].[NameAS [Name
  253.             FROM ( 
  254.           SELECT 
  255.           quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME) + quotename(c.COLUMN_NAME) [Id] 
  256.           ,   quotename(c.TABLE_SCHEMA) + quotename(c.TABLE_NAME)                             [ParentId] 
  257.           ,   c.COLUMN_NAME   [Name
  258.           ,   c.ORDINAL_POSITION [Ordinal] 
  259.           ,   CASTCASE c.IS_NULLABLE WHEN 'YES' THEN 1 WHEN 'NO' THEN 0 ELSE 0 END as bit) [IsNullable] 
  260.           ,   CASE 
  261.           WHEN c.DATA_TYPE in ('varchar''nvarchar''varbinary'and 
  262.           c.CHARACTER_MAXIMUM_LENGTH = -1 THEN 
  263.           c.DATA_TYPE + '(max)' 
  264.           ELSE 
  265.           c.DATA_TYPE 
  266.           END 
  267.           as [TypeName] 
  268.           ,   c.CHARACTER_MAXIMUM_LENGTH [MaxLength] 
  269.           ,   CAST(c.NUMERIC_PRECISION as integer) [Precision
  270.           ,   CAST(c.DATETIME_PRECISION as integeras [DateTimePrecision] 
  271.           ,   CAST(c.NUMERIC_SCALE as integer) [Scale] 
  272.           ,   c.COLLATION_CATALOG [CollationCatalog] 
  273.           ,   c.COLLATION_SCHEMA [CollationSchema] 
  274.           ,   c.COLLATION_NAME [CollationName] 
  275.           ,   c.CHARACTER_SET_CATALOG [CharacterSetCatalog] 
  276.           ,   c.CHARACTER_SET_SCHEMA [CharacterSetSchema] 
  277.           ,   c.CHARACTER_SET_NAME [CharacterSetName] 
  278.           ,   CAST(0 as bitas [IsMultiSet] 
  279.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsIdentity' ) as bitas [IsIdentity] 
  280.           ,   CAST(columnproperty( object_id(quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)), c.COLUMN_NAME, 'IsComputed' ) | CASE WHEN c.DATA_TYPE = 'timestamp' THEN 1 ELSE 0 END as bitas [IsStoreGenerated] 
  281.           ,   c.COLUMN_DEFAULT [Default
  282.           FROM 
  283.           INFORMATION_SCHEMA.COLUMNS c 
  284.           INNER JOIN 
  285.           INFORMATION_SCHEMA.VIEWS v ON 
  286.           c.TABLE_CATALOG = v.TABLE_CATALOG AND 
  287.           c.TABLE_SCHEMA = v.TABLE_SCHEMA AND 
  288.           c.TABLE_NAME = v.TABLE_NAME 
  289.           WHERE 
  290.           NOT (v.TABLE_SCHEMA = 'dbo' 
  291.           AND v.TABLE_NAME in('syssegments''sysconstraints'
  292.           AND SUBSTRING(CAST(SERVERPROPERTY('productversion'as varchar(20)),1,1) = 8) 
  293.       ) AS [Extent10]) AS [UnionAll3] ON ([UnionAll1].[C2] = [UnionAll3].[C1]) AND ([UnionAll1].[FromColumnId] = [UnionAll3].[Id]) ) AS [Join5] ON (0 = [Join5].[C11]) AND ([Extent1].[Id] = [Join5].[ConstraintId]) AND ([Join5].[Id1] = [Extent1].[Id]) 
  294.     LEFT OUTER JOIN  (SELECT  
  295.         3 AS [C1],  
  296.         [Extent11].[Id] AS [Id],  
  297.         [Extent11].[NameAS [Name],  
  298.         [Extent11].[CatalogName] AS [CatalogName],  
  299.         [Extent11].[SchemaName] AS [SchemaName] 
  300.         FROM ( 
  301.         SELECT 
  302.         quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) [Id] 
  303.         ,   TABLE_CATALOG [CatalogName] 
  304.         ,   TABLE_SCHEMA [SchemaName] 
  305.         ,   TABLE_NAME    [Name
  306.         FROM 
  307.         INFORMATION_SCHEMA.TABLES 
  308.         WHERE 
  309.         TABLE_TYPE = 'BASE TABLE' 
  310.       ) AS [Extent11] 
  311.     UNION ALL 
  312.         SELECT  
  313.         12 AS [C1],  
  314.         [Extent12].[Id] AS [Id],  
  315.         [Extent12].[NameAS [Name],  
  316.         [Extent12].[CatalogName] AS [CatalogName],  
  317.         [Extent12].[SchemaName] AS [SchemaName] 
  318.         FROM ( 
  319.         SELECT 
  320.         quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) [Id] 
  321.         ,   TABLE_CATALOG             [CatalogName] 
  322.         ,   TABLE_SCHEMA              [SchemaName] 
  323.         ,   TABLE_NAME                [Name
  324.         ,   VIEW_DEFINITION           [ViewDefinition] 
  325.         ,   CASTCASE IS_UPDATABLE WHEN 'YES' THEN 1 WHEN 'NO' THEN 0 ELSE 0 END as bit) [IsUpdatable] 
  326.         FROM 
  327.         INFORMATION_SCHEMA.VIEWS 
  328.         WHERE 
  329.         NOT (TABLE_SCHEMA = 'dbo' 
  330.         AND TABLE_NAME in('syssegments''sysconstraints'
  331.         AND SUBSTRING(CAST(SERVERPROPERTY('productversion'as varchar(20)),1,1) = 8) 
  332.       ) AS [Extent12]) AS [UnionAll4] ON ([Join5].[C21] = [UnionAll4].[C1]) AND ([Join5].[ParentId1] = [UnionAll4].[Id]) 
  333.     LEFT OUTER JOIN  (SELECT  
  334.         3 AS [C1],  
  335.         [Extent13].[Id] AS [Id],  
  336.         [Extent13].[NameAS [Name],  
  337.         [Extent13].[CatalogName] AS [CatalogName],  
  338.         [Extent13].[SchemaName] AS [SchemaName] 
  339.         FROM ( 
  340.         SELECT 
  341.         quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) [Id] 
  342.         ,   TABLE_CATALOG [CatalogName] 
  343.         ,   TABLE_SCHEMA [SchemaName] 
  344.         ,   TABLE_NAME    [Name
  345.         FROM 
  346.         INFORMATION_SCHEMA.TABLES 
  347.         WHERE 
  348.         TABLE_TYPE = 'BASE TABLE' 
  349.       ) AS [Extent13] 
  350.     UNION ALL 
  351.         SELECT  
  352.         12 AS [C1],  
  353.         [Extent14].[Id] AS [Id],  
  354.         [Extent14].[NameAS [Name],  
  355.         [Extent14].[CatalogName] AS [CatalogName],  
  356.         [Extent14].[SchemaName] AS [SchemaName] 
  357.         FROM ( 
  358.         SELECT 
  359.         quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) [Id] 
  360.         ,   TABLE_CATALOG             [CatalogName] 
  361.         ,   TABLE_SCHEMA              [SchemaName] 
  362.         ,   TABLE_NAME                [Name
  363.         ,   VIEW_DEFINITION           [ViewDefinition] 
  364.         ,   CASTCASE IS_UPDATABLE WHEN 'YES' THEN 1 WHEN 'NO' THEN 0 ELSE 0 END as bit) [IsUpdatable] 
  365.         FROM 
  366.         INFORMATION_SCHEMA.VIEWS 
  367.         WHERE 
  368.         NOT (TABLE_SCHEMA = 'dbo' 
  369.         AND TABLE_NAME in('syssegments''sysconstraints'
  370.         AND SUBSTRING(CAST(SERVERPROPERTY('productversion'as varchar(20)),1,1) = 8) 
  371.       ) AS [Extent14]) AS [UnionAll5] ON (3 = [UnionAll5].[C1]) AND ([Extent2].[ParentId] = [UnionAll5].[Id]) 
  372. )  AS [Project11] 
  373. ORDER BY [Project11].[NameASC, [Project11].[Id] ASC, [Project11].[C1] ASC 

4) 最后这个查询返回数据库中存储过程和函数的相关信息。

  1. SELECT  
  2. [Project7].[C12] AS [C1],  
  3. [Project7].[C1] AS [C2],  
  4. [Project7].[C2] AS [C3],  
  5. [Project7].[C3] AS [C4],  
  6. [Project7].[C4] AS [C5],  
  7. [Project7].[C5] AS [C6],  
  8. [Project7].[C6] AS [C7],  
  9. [Project7].[C7] AS [C8],  
  10. [Project7].[C8] AS [C9],  
  11. [Project7].[C9] AS [C10],  
  12. [Project7].[C10] AS [C11] 
  13. FROM ( SELECT  
  14.     [UnionAll3].[SchemaName] AS [C1],  
  15.     [UnionAll3].[NameAS [C2],  
  16.     [UnionAll3].[ReturnTypeName] AS [C3],  
  17.     [UnionAll3].[IsAggregate] AS [C4],  
  18.     [UnionAll3].[C1] AS [C5],  
  19.     [UnionAll3].[IsBuiltIn] AS [C6],  
  20.     [UnionAll3].[IsNiladic] AS [C7],  
  21.     [UnionAll3].[C2] AS [C8],  
  22.     [UnionAll3].[C3] AS [C9],  
  23.     [UnionAll3].[C4] AS [C10],  
  24.     [UnionAll3].[C5] AS [C11],  
  25.     1 AS [C12] 
  26.     FROM  (SELECT  
  27.         [Extent1].[SchemaName] AS [SchemaName],  
  28.         [Extent1].[NameAS [Name],  
  29.         [Extent1].[ReturnTypeName] AS [ReturnTypeName],  
  30.         [Extent1].[IsAggregate] AS [IsAggregate],  
  31.         cast(1 as bitAS [C1],  
  32.         [Extent1].[IsBuiltIn] AS [IsBuiltIn],  
  33.         [Extent1].[IsNiladic] AS [IsNiladic],  
  34.         [UnionAll1].[NameAS [C2],  
  35.         [UnionAll1].[TypeName] AS [C3],  
  36.         [UnionAll1].[Mode] AS [C4],  
  37.         [UnionAll1].[Ordinal] AS [C5] 
  38.         FROM  ( 
  39.         SELECT 
  40.         quotename(SPECIFIC_SCHEMA) + quotename(SPECIFIC_NAME) [Id] 
  41.         , SPECIFIC_CATALOG         [CatalogName] 
  42.         , SPECIFIC_SCHEMA          [SchemaName] 
  43.         , SPECIFIC_NAME            [Name
  44.         ,   CASE 
  45.         WHEN DATA_TYPE in ('varchar''nvarchar''varbinary'and 
  46.         CHARACTER_MAXIMUM_LENGTH = -1 THEN 
  47.         DATA_TYPE + '(max)' 
  48.         ELSE 
  49.         DATA_TYPE 
  50.         END [ReturnTypeName] 
  51.         , CHARACTER_MAXIMUM_LENGTH            [ReturnMaxLength] 
  52.         , CAST(NUMERIC_PRECISION as integer)  [ReturnPrecision] 
  53.         , CAST(DATETIME_PRECISION as integer) [ReturnDateTimePrecision] 
  54.         , CAST(NUMERIC_SCALE as integer)      [ReturnScale] 
  55.         , COLLATION_CATALOG        [ReturnCollationCatalog] 
  56.         , COLLATION_SCHEMA         [ReturnCollationSchema] 
  57.         , COLLATION_NAME           [ReturnCollationName] 
  58.         , CHARACTER_SET_CATALOG    [ReturnCharacterSetCatalog] 
  59.         , CHARACTER_SET_SCHEMA     [ReturnCharacterSetSchema] 
  60.         , CHARACTER_SET_NAME       [ReturnCharacterSetName] 
  61.         , CAST(0 as bitas        [ReturnIsMultiSet] 
  62.         , CAST(0 as bitas [IsAggregate] 
  63.         , CAST(0 as bitas [IsBuiltIn] 
  64.         , CAST(0 as bitas [IsNiladic] 
  65.         FROM 
  66.         INFORMATION_SCHEMA.ROUTINES 
  67.         WHERE 
  68.         NOT (ROUTINE_SCHEMA = 'dbo' 
  69.         AND ROUTINE_NAME LIKE 'dt[_]%' 
  70.         AND SUBSTRING(CAST(SERVERPROPERTY('productversion'as varchar(20)),1,1) = 8) 
  71.         AND (DATA_TYPE != 'TABLE' OR DATA_TYPE is null
  72.         AND ROUTINE_TYPE = 'FUNCTION' 
  73.       ) AS [Extent1] 
  74.         LEFT OUTER JOIN  (SELECT  
  75.             [Extent2].[NameAS [Name],  
  76.             [Extent2].[Ordinal] AS [Ordinal],  
  77.             [Extent2].[TypeName] AS [TypeName],  
  78.             [Extent2].[Mode] AS [Mode],  
  79.             0 AS [C1],  
  80.             [Extent2].[ParentId] AS [ParentId] 
  81.             FROM ( 
  82.         SELECT 
  83.         quotename(f.SPECIFIC_SCHEMA) + quotename(f.SPECIFIC_NAME) + quotename(f.PARAMETER_NAME) [Id] 
  84.         , quotename(f.SPECIFIC_SCHEMA) + quotename(f.SPECIFIC_NAME)                              [ParentId] 
  85.         , CASE -- trim off the @ symbol 
  86.         WHEN f.PARAMETER_NAME is null THEN NULL 
  87.         ELSE SUBSTRING(f.PARAMETER_NAME, 2, LEN(f.PARAMETER_NAME) ) 
  88.         END   [Name
  89.         , f.ORDINAL_POSITION [Ordinal] 
  90.         , CASE 
  91.         WHEN f.DATA_TYPE in ('varchar''nvarchar''varbinary'and 
  92.         f.CHARACTER_MAXIMUM_LENGTH = -1 THEN 
  93.         f.DATA_TYPE + '(max)' 
  94.         ELSE 
  95.         f.DATA_TYPE 
  96.         END [TypeName] 
  97.         , f.CHARACTER_MAXIMUM_LENGTH [MaxLength] 
  98.         , CAST(f.NUMERIC_PRECISION as integer) [Precision
  99.         , CAST(f.DATETIME_PRECISION as integeras [DateTimePrecision] 
  100.         , CAST(f.NUMERIC_SCALE as integer) [Scale] 
  101.         , f.COLLATION_CATALOG [CollationCatalog] 
  102.         , f.COLLATION_SCHEMA [CollationSchema] 
  103.         , f.COLLATION_NAME [CollationName] 
  104.         , f.CHARACTER_SET_CATALOG [CharacterSetCatalog] 
  105.         , f.CHARACTER_SET_SCHEMA [CharacterSetSchema] 
  106.         , f.CHARACTER_SET_NAME [CharacterSetName] 
  107.         , CAST(0 as bitas [IsMultiSet] 
  108.         , f.PARAMETER_MODE   [Mode] 
  109.         , CAST(NULL as nvarchar(max))  [Default
  110.         FROM 
  111.         INFORMATION_SCHEMA.PARAMETERS f 
  112.         INNER JOIN INFORMATION_SCHEMA.ROUTINES r ON 
  113.         f.SPECIFIC_SCHEMA = r.SPECIFIC_SCHEMA AND 
  114.         f.SPECIFIC_NAME = r.SPECIFIC_NAME AND 
  115.         r.ROUTINE_TYPE = 'FUNCTION' 
  116.         WHERE 
  117.         f.IS_RESULT = 'NO' 
  118.       ) AS [Extent2] 
  119.         UNION ALL 
  120.             SELECT  
  121.             [Extent3].[NameAS [Name],  
  122.             [Extent3].[Ordinal] AS [Ordinal],  
  123.             [Extent3].[TypeName] AS [TypeName],  
  124.             [Extent3].[Mode] AS [Mode],  
  125.             6 AS [C1],  
  126.             [Extent3].[ParentId] AS [ParentId] 
  127.             FROM ( 
  128.         SELECT 
  129.         quotename(p.SPECIFIC_SCHEMA) + quotename(p.SPECIFIC_NAME) + quotename(p.PARAMETER_NAME) [Id] 
  130.         , quotename(p.SPECIFIC_SCHEMA) + quotename(p.SPECIFIC_NAME)                              [ParentId] 
  131.         , CASE -- trim off the @ symbol 
  132.         WHEN p.PARAMETER_NAME is null THEN NULL 
  133.         ELSE SUBSTRING(p.PARAMETER_NAME, 2, LEN(p.PARAMETER_NAME) ) 
  134.         END   [Name
  135.         , p.ORDINAL_POSITION [Ordinal] 
  136.         , CASE 
  137.         WHEN p.DATA_TYPE in ('varchar''nvarchar''varbinary'and 
  138.         p.CHARACTER_MAXIMUM_LENGTH = -1 THEN 
  139.         p.DATA_TYPE + '(max)' 
  140.         ELSE 
  141.         p.DATA_TYPE 
  142.         END [TypeName] 
  143.         , p.CHARACTER_MAXIMUM_LENGTH [MaxLength] 
  144.         , CAST(p.NUMERIC_PRECISION as integer) [Precision
  145.         , CAST(p.DATETIME_PRECISION as integeras [DateTimePrecision] 
  146.         , CAST(p.NUMERIC_SCALE as integer) [Scale] 
  147.         , p.COLLATION_CATALOG [CollationCatalog] 
  148.         , p.COLLATION_SCHEMA [CollationSchema] 
  149.         , p.COLLATION_NAME [CollationName] 
  150.         , p.CHARACTER_SET_CATALOG [CharacterSetCatalog] 
  151.         , p.CHARACTER_SET_SCHEMA [CharacterSetSchema] 
  152.         , p.CHARACTER_SET_NAME [CharacterSetName] 
  153.         , CAST(0 as bitas [IsMultiSet] 
  154.         , p.PARAMETER_MODE   [Mode] 
  155.         , CAST(NULL as nvarchar(max)) [Default
  156.         FROM 
  157.         INFORMATION_SCHEMA.PARAMETERS p 
  158.         INNER JOIN INFORMATION_SCHEMA.ROUTINES r ON 
  159.         p.SPECIFIC_SCHEMA = r.SPECIFIC_SCHEMA AND 
  160.         p.SPECIFIC_NAME = r.SPECIFIC_NAME AND 
  161.         r.ROUTINE_TYPE = 'PROCEDURE' 
  162.         WHERE 
  163.         p.IS_RESULT = 'NO' 
  164.       ) AS [Extent3]) AS [UnionAll1] ON (0 = [UnionAll1].[C1]) AND ([Extent1].[Id] = [UnionAll1].[ParentId]) 
  165.     UNION ALL 
  166.         SELECT  
  167.         [Extent4].[SchemaName] AS [SchemaName],  
  168.         [Extent4].[NameAS [Name],  
  169.         CAST(NULL AS varchar(1)) AS [C1],  
  170.         cast(0 as bitAS [C2],  
  171.         cast(0 as bitAS [C3],  
  172.         cast(0 as bitAS [C4],  
  173.         cast(0 as bitAS [C5],  
  174.         [UnionAll2].[NameAS [C6],  
  175.         [UnionAll2].[TypeName] AS [C7],  
  176.         [UnionAll2].[Mode] AS [C8],  
  177.         [UnionAll2].[Ordinal] AS [C9] 
  178.         FROM  ( 
  179.         SELECT 
  180.         quotename(SPECIFIC_SCHEMA) + quotename(SPECIFIC_NAME) [Id] 
  181.         , SPECIFIC_CATALOG         [CatalogName] 
  182.         , SPECIFIC_SCHEMA          [SchemaName] 
  183.         , SPECIFIC_NAME            [Name
  184.         FROM 
  185.         INFORMATION_SCHEMA.ROUTINES 
  186.         WHERE 
  187.         NOT (ROUTINE_SCHEMA = 'dbo' 
  188.         AND ROUTINE_NAME LIKE 'dt[_]%' 
  189.         AND SUBSTRING(CAST(SERVERPROPERTY('productversion'as varchar(20)),1,1) = 8) 
  190.         AND (DATA_TYPE != 'TABLE' OR DATA_TYPE is null
  191.         AND ROUTINE_TYPE = 'PROCEDURE' 
  192.       ) AS [Extent4] 
  193.         LEFT OUTER JOIN  (SELECT  
  194.             [Extent5].[NameAS [Name],  
  195.             [Extent5].[Ordinal] AS [Ordinal],  
  196.             [Extent5].[TypeName] AS [TypeName],  
  197.             [Extent5].[Mode] AS [Mode],  
  198.             0 AS [C1],  
  199.             [Extent5].[ParentId] AS [ParentId] 
  200.             FROM ( 
  201.         SELECT 
  202.         quotename(f.SPECIFIC_SCHEMA) + quotename(f.SPECIFIC_NAME) + quotename(f.PARAMETER_NAME) [Id] 
  203.         , quotename(f.SPECIFIC_SCHEMA) + quotename(f.SPECIFIC_NAME)                              [ParentId] 
  204.         , CASE -- trim off the @ symbol 
  205.         WHEN f.PARAMETER_NAME is null THEN NULL 
  206.         ELSE SUBSTRING(f.PARAMETER_NAME, 2, LEN(f.PARAMETER_NAME) ) 
  207.         END   [Name
  208.         , f.ORDINAL_POSITION [Ordinal] 
  209.         , CASE 
  210.         WHEN f.DATA_TYPE in ('varchar''nvarchar''varbinary'and 
  211.         f.CHARACTER_MAXIMUM_LENGTH = -1 THEN 
  212.         f.DATA_TYPE + '(max)' 
  213.         ELSE 
  214.         f.DATA_TYPE 
  215.         END [TypeName] 
  216.         , f.CHARACTER_MAXIMUM_LENGTH [MaxLength] 
  217.         , CAST(f.NUMERIC_PRECISION as integer) [Precision
  218.         , CAST(f.DATETIME_PRECISION as integeras [DateTimePrecision] 
  219.         , CAST(f.NUMERIC_SCALE as integer) [Scale] 
  220.         , f.COLLATION_CATALOG [CollationCatalog] 
  221.         , f.COLLATION_SCHEMA [CollationSchema] 
  222.         , f.COLLATION_NAME [CollationName] 
  223.         , f.CHARACTER_SET_CATALOG [CharacterSetCatalog] 
  224.         , f.CHARACTER_SET_SCHEMA [CharacterSetSchema] 
  225.         , f.CHARACTER_SET_NAME [CharacterSetName] 
  226.         , CAST(0 as bitas [IsMultiSet] 
  227.         , f.PARAMETER_MODE   [Mode] 
  228.         , CAST(NULL as nvarchar(max))  [Default
  229.         FROM 
  230.         INFORMATION_SCHEMA.PARAMETERS f 
  231.         INNER JOIN INFORMATION_SCHEMA.ROUTINES r ON 
  232.         f.SPECIFIC_SCHEMA = r.SPECIFIC_SCHEMA AND 
  233.         f.SPECIFIC_NAME = r.SPECIFIC_NAME AND 
  234.         r.ROUTINE_TYPE = 'FUNCTION' 
  235.         WHERE 
  236.         f.IS_RESULT = 'NO' 
  237.       ) AS [Extent5] 
  238.         UNION ALL 
  239.             SELECT  
  240.             [Extent6].[NameAS [Name],  
  241.             [Extent6].[Ordinal] AS [Ordinal],  
  242.             [Extent6].[TypeName] AS [TypeName],  
  243.             [Extent6].[Mode] AS [Mode],  
  244.             6 AS [C1],  
  245.             [Extent6].[ParentId] AS [ParentId] 
  246.             FROM ( 
  247.         SELECT 
  248.         quotename(p.SPECIFIC_SCHEMA) + quotename(p.SPECIFIC_NAME) + quotename(p.PARAMETER_NAME) [Id] 
  249.         , quotename(p.SPECIFIC_SCHEMA) + quotename(p.SPECIFIC_NAME)                              [ParentId] 
  250.         , CASE -- trim off the @ symbol 
  251.         WHEN p.PARAMETER_NAME is null THEN NULL 
  252.         ELSE SUBSTRING(p.PARAMETER_NAME, 2, LEN(p.PARAMETER_NAME) ) 
  253.         END   [Name
  254.         , p.ORDINAL_POSITION [Ordinal] 
  255.         , CASE 
  256.         WHEN p.DATA_TYPE in ('varchar''nvarchar''varbinary'and 
  257.         p.CHARACTER_MAXIMUM_LENGTH = -1 THEN 
  258.         p.DATA_TYPE + '(max)' 
  259.         ELSE 
  260.         p.DATA_TYPE 
  261.         END [TypeName] 
  262.         , p.CHARACTER_MAXIMUM_LENGTH [MaxLength] 
  263.         , CAST(p.NUMERIC_PRECISION as integer) [Precision
  264.         , CAST(p.DATETIME_PRECISION as integeras [DateTimePrecision] 
  265.         , CAST(p.NUMERIC_SCALE as integer) [Scale] 
  266.         , p.COLLATION_CATALOG [CollationCatalog] 
  267.         , p.COLLATION_SCHEMA [CollationSchema] 
  268.         , p.COLLATION_NAME [CollationName] 
  269.         , p.CHARACTER_SET_CATALOG [CharacterSetCatalog] 
  270.         , p.CHARACTER_SET_SCHEMA [CharacterSetSchema] 
  271.         , p.CHARACTER_SET_NAME [CharacterSetName] 
  272.         , CAST(0 as bitas [IsMultiSet] 
  273.         , p.PARAMETER_MODE   [Mode] 
  274.         , CAST(NULL as nvarchar(max)) [Default
  275.         FROM 
  276.         INFORMATION_SCHEMA.PARAMETERS p 
  277.         INNER JOIN INFORMATION_SCHEMA.ROUTINES r ON 
  278.         p.SPECIFIC_SCHEMA = r.SPECIFIC_SCHEMA AND 
  279.         p.SPECIFIC_NAME = r.SPECIFIC_NAME AND 
  280.         r.ROUTINE_TYPE = 'PROCEDURE' 
  281.         WHERE 
  282.         p.IS_RESULT = 'NO' 
  283.       ) AS [Extent6]) AS [UnionAll2] ON (6 = [UnionAll2].[C1]) AND ([Extent4].[Id] = [UnionAll2].[ParentId])) AS [UnionAll3] 
  284. )  AS [Project7] 
  285. ORDER BY [Project7].[C1] ASC, [Project7].[C2] ASC, [Project7].[C11] ASC 

通过以上四个查询所得到的信息,EF Power Tool便可以地生成对应的class。具体的实现就比较复杂了,今天就不详细探究。(之后会为大家奉上)。

 

看到这里大家是否想到这样一个问题?如果我们访问数据库所使用的用户没有执行这些查询的权限会怎么样呢?这样生成的代码自然会很不完全。许多代码只 生成了一部分,有些命名空间和程序集都没有被自动导入。这就产生了类似上一篇文章中,用户@Zero0420所碰到的问题:“为什么我老是生成的时 候,DbModelBuilder 找不到命名空间?”

 

经过一番研究与试验后,我们使用的用户对于所要操作的数据库必须要符合以下权限中的一个:db_datareader, db_datawriter, db_ddladmin, db_owner以及db_securityadmin。有关这些权限更详细的说明,请参看:http://msdn.microsoft.com/en-us/library/ms189121(v=SQL.105).aspx

 

 

2. EF Power Tool在生成Entity Data Model (.edmx和.XML)、Entity Data Model DDL以及生成Generated View的代码时为何会报ProviderIncompatibleException的错误?

接下来我们讨论另一个EF Power Tool的问题。在使用它为我们生成Entity Data Model (.edmx和.XML)、Entity Data Model DDL以及生成Generated View的代码时,

我的一个同事以及其他的一些用户碰到了这个错误信息:System.Data.ProviderIncompatibleException: The provider did not return a ProviderManifestToken string。从这个错误我们并不能得到太多有用的信息,所以我们就进一步查看了Visual Studio Output Window中更详细的错误信息:

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)。熟悉SQL Server的用户肯定对这个错误信息不陌生。似乎我们的用户对相应的SQL Server数据库访问不了或权限受限? 这怎么可能呢?之前Code First POCO class都生成得很好啊。我们此时又用SQL Server Management Studio和Visual Studio连接了相应的数据库,发现运行都很正常。太奇怪了。。。

  1. public class EFToolContext : DbContext 
  2.     { 
  3.         public EFToolContext() :  
  4.             base(@"Data Source=.\;Initial Catalog=EFTool;Integrated Security=True;Pooling=False"
  5.         { 
  6.  
  7.         } 
  8.  
  9.         static EFToolContext() 
  10.         {  
  11.             Database.SetInitializer<EFToolContext>(null); 
  12.         } 
  13.  
  14.         public DbSet<Child> Children { getset; } 
  15.         public DbSet<Parent> Parents { getset; } 
  16.  
  17.         protected override void OnModelCreating(DbModelBuilder modelBuilder) 
  18.         { 
  19.             modelBuilder.Conventions.Remove<IncludeMetadataConvention>(); 
  20.             modelBuilder.Configurations.Add(new ChildMap()); 
  21.             modelBuilder.Configurations.Add(new ParentMap()); 
  22.         } 
  23.     } 

相同的情况在我自己的机器上就能运行正常。难道是同事项目里的App.config中的connection string有问题?我们又重新检查了一下,发现connection string没有问题。另一位同事@Alan_chen此时对相应的DbContext class做了很小的修改,将connection string直接写入了class中:

 

此时,EF Power Tool能运行正常。果然是哪里传递connection string出了问题。之后我发现同事的机器上并不存在.\SQLExpress实例,这个发现顿时让我茅塞顿开。难道EF Power Tool会去尝试访问.\SQLExpress吗?用SQL Server Profiler观察我机器上的.\SQLExpress实例后,发现果然如此。EF Power Tool会尝试去连接.\SQLExpress但是并不会做任何数据查询,而真正的Named Instance则无需访问,因为所有数据库端得信息已经可以从DbContext,POCO以及mapping class中得到。

 

为什么要去访问.\SQLExpress实例?在我看来,这是EF Power Tool代码中的一个缺陷。为此,我也在询问有关的产品组。不过EF Power Tool也才CTP1,有些瑕疵也在所难免吧。Smile

本站热点业务

更多模板/案例展示

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作