如何使用sql在xml中定义PK?

时间:2014-09-25 11:10:32

标签: sql sql-server xml sql-server-2008-r2

是否可以使用sql在xml中创建主键和外键标记? 像

  <Column Name="ID" DataType="INTEGER" IsPrimaryKey="true" />
  <ForeignKey SourceTable="Product" TargetTable="Market">
  <ColumnMap Source="ID" Target="ID" Ordinal="1" />
  </ForeignKey>

我使用以下部分,但它没有显示PK和FK部分:

    select COLUMN_NAME as '@Name',
           Data_type as '@DataType',
           character_octet_length as '@Length'
           FROM information_schema.COLUMNS 
    FOR XML PATH ('Column'), TYPE

1 个答案:

答案 0 :(得分:0)

要记住的一件重要事情是,主键和外键是在表级定义的,而不是针对单个列定义的,这可能会导致相当复杂的查询以构建所需的数据。例如,很可能有一个覆盖多个领域的主键;将列定义为除了它所属的表之外的大量表上的外键也很常见。

考虑到这一点 - 并且由于时间限制 - 以下仅处理主键,并且我仅在单列主键上测试它:

  SELECT c.COLUMN_NAME as '@Name',
        c.TABLE_NAME as '@Table',
        Data_type as '@DataType',
        character_octet_length as '@Length', case when tc.CONSTRAINT_NAME IS NULL then 'false' else 'true' end as '@IsPrimaryKey'
    FROM information_schema.COLUMNS c
        left outer join INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu on c.TABLE_NAME = kcu.TABLE_NAME and kcu.COLUMN_NAME = c.COLUMN_NAME
        left outer join  INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc on tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME and tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
    FOR XML PATH ('Column'), TYPE

为清楚起见,我在输出中包含了表名。样本输出:

<Column Name="AdministratorID" Table="Administrator" DataType="int"
    IsPrimaryKey="true" /><Column Name="UserName" Table="Administrator"
    DataType="varchar" Length="50" IsPrimaryKey="false" /><Column Name=
    ...

我意识到这并不完全符合您的要求,但它应该为您提供一些可以构建的东西。