Добавить ограничение первичного ключа автоматически - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть следующая таблица InfoSchema, которая содержит SchemaName и TableName каждой таблицы в моей тестовой базе данных:

SchemaName TableName
dbo        Employee
dbo        Department
Function   Company
Finance    Payslips
Sub        ProjectSub

Я хочу добавить для каждой таблицы ограничение PrimaryKey к столбцу, заканчивающемуся ID или Id: В dbo.Employee есть один столбец EmployeeId, поэтому запрос будет выглядеть следующим образом:

ALTER TABLE dbo.Employee
ADD CONSTRAINT Employee_pk PRIMARY KEY (EmployeeId);

Для Sub.ProjectSub есть 3 столбца, заканчивающиеся Id:

  • ProjectId
  • CompanyId
  • SubId

Ограничение будет добавлено в первый столбец, появляющийся в структуре таблицы.

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Как я упоминаю в своем комментарии, вы можете использовать динамический оператор c для создания операторов. Однако я очень настоятельно предлагаю просмотреть сгенерированный SQL, поэтому я не включаю здесь оператор EXEC sp_executesql. PRINT или SELECT значение @SQL и сначала проверьте его, а затем выполните необходимые инструкции:

DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10);

SET @SQL = STUFF((SELECT @CRLF + @CRLF +
                         N'ALTER TABLE ' + QUOTENAME(s.[name]) + N'.' + QUOTENAME(t.[name]) + @CRLF +
                         N'ADD CONSTRAINT ' + QUOTENAME(CONCAT(t.[name],N'_PK')) + N' PRIMARY KEY (' + QUOTENAME(c.[name]) + N');'
                  FROM sys.schemas s
                       JOIN sys.tables t ON s.schema_id = t.schema_id
                       CROSS APPLY (SELECT TOP 1 *
                                    FROM sys.columns c
                                    WHERE c.object_id = t.object_id
                                      AND c.name LIKE '%id'
                                    ORDER BY c.column_id ASC) c
                 WHERE NOT EXISTS (SELECT 1
                                   FROM sys.key_constraints k
                                   WHERE k.[type] = 'PK'
                                     AND k.parent_object_id = t.object_id)
                 FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,4,N'');

PRINT @SQL;

Этот предполагает , что первый столбец, как правило, обычно , должен быть PK, и он не будет пытаться создать PK на таблице, в которой он уже есть.

1 голос
/ 14 апреля 2020

Не возможно. В SQL Server для этого нет автоматики, поэтому для запуска таблиц и столбцов и выдачи операторов изменения потребуется как минимум скрипт для запуска над БД. Который не является "automati c", так как он не будет запускать automati c - вам нужно запустить его на втором шаге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...