【问题标题】:T-SQL (Azure Synapse) Dynamic grouping based on unknown number of Primary KeysT-SQL (Azure Synapse) 基于未知数量主键的动态分组
【发布时间】:2022-01-13 17:23:11
【问题描述】:

我的任务是创建一个 sp,它将遍历提供的架构中的每个表,并找到没有唯一主键(重复主键)的任何表。一些表可能只有一列创建主键,而另一些表可能有包含未知列数的复合键。

例如:

CREATE DATABASE test
USE TEST
CREATE PROC duplicateCheck @schemaChoice nvarchar(60)= 'test'
CREATE TABLE onePrimary(

      id int,
      orders int,
      orderCustomer varchar(20)
      PRIMARY KEY (id)
    )
CREATE TABLE twoPrimary(
      id int,
      item int,
      color varchar(20),
      size varchar(20),
      PRIMARY KEY(id,item)
    )
INSERT INTO onePrimary
VALUES(1,2,'Brad'),
(2,1,'Lenny'),
(3,1,'Rachel')

INSERT INTO twoPrimary
VALUES(1,1,'yellow','large'),
(2,1,'blue','small')


create table #primaryKey(
       TABLE_NAME varchar(20),
       COLUMN_NAME varchar(20)
    )
SELECT @schemaChoice,
       x.TABLE_NAME,
       x.COLUMN_NAME,
    FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE x, INFORMATION_SCHEMA.TABLE_CONSTRAINTS y
    WHERE x.TABLE_SCHEMA = @schemaChoice
    and y.CONSTRAINT_TYPE like 'PRIMARY KEY'

这就是我卡住的地方。

【问题讨论】:

    标签: sql tsql stored-procedures dynamic-sql azure-synapse


    【解决方案1】:

    您可以使用系统视图在 Sql Server(和 Azure Synapse)中找到此信息。

    下面会列出所有的用户表,主键的名字和定义了多少键列。

    select Schema_Name(t.schema_id) SchemaName, t.name TableName, i.name PrimaryKey, Count(*) KeyColumnCount
    from sys.tables t
    join sys.indexes i on i.object_id = t.object_id and i.is_primary_key = 1
    join sys.index_columns ic on ic.object_id = t.object_id and ic.index_id = i.index_id
    group by t.name, i.name, Schema_Name(t.schema_id)
    order by KeyColumnCount
    

    您可以在group by 之后添加having count(*)>1 以仅列出具有多个键列的表,当然还有您需要的任何其他过滤。

    【讨论】:

    • 我了解如何获取主键信息,问题是如何在架构中查找具有重复主键的表。我想要一个存储过程,我将架构名称作为参数传递,并且该过程循环遍历架构中的每个表以查找每个表中的重复项。由于我们事先不知道每个表的主键,因此必须在过程中的某处添加信息,因此我们知道根据什么分组来查找重复项
    • 也许我还没有完全理解,你说的重复主键是什么意思——每个表只能定义一个主键。您还提到了在 1 列上定义的主键和复合键,我假设您指的是后者,您的示例脚本也表明了这一点。上面的查询查找所有主键中包含多于一列的表。您可以添加 where Schema_Name(t.schema_id) =@schemaNameParameter 以限制特定架构。
    • 我们在突触中遇到了一种情况,我们已经定义了主键,但表仍在加载重复的主键。简而言之,这就是问题所在:我们需要动态地在给定模式中找到具有重复主键的表(即提供模式名称并且存储过程会吐出具有重复主键的表。)我给出的脚本本质上是引导到我真正想要的内容,这样您就不必重新输入。
    猜你喜欢
    • 2021-09-19
    • 2021-11-20
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2021-09-29
    • 2017-12-06
    • 2019-03-21
    • 2020-08-03
    相关资源
    最近更新 更多