Обновление значения в таблицах, выбранных из sys.columns и sys.tables - PullRequest
1 голос
/ 15 мая 2019

Один из идентификаторов наших пользователей был обновлен в одной таблице, но не в других 63 таблицах в базе данных. Мне нужно обновить этот идентификатор во всех других таблицах с помощью столбца UserID.

Мне удалось выбрать все нужные мне таблицы из sys.tables и sys.columns, я просто не уверен на 100%, как обновить значение в каждой из этих таблиц.

Я выбираю таблицы с помощью этого запроса:

SELECT      c.name  AS 'ColumnName'
            ,t.name AS 'TableName'
FROM        sys.columns c
JOIN        sys.tables  t   ON c.object_id = t.object_id
WHERE       c.name LIKE '%UserID%'
ORDER BY    TableName
            ,ColumnName;

Это дает мне список всех соответствующих таблиц и имен столбцов.

Я изменил вышеуказанный запрос, чтобы также генерировать SQL:

declare @newID varchar(12) = '149080'
declare @oldID varchar(12) = '146423'

SELECT 'UPDATE ' + t.name + ' SET ' + c.name + ' = ' + @newID + ' WHERE ' + c.name + ' = ' + @oldID + ';'
FROM        sys.columns c
JOIN        sys.tables  t   ON c.object_id = t.object_id
WHERE       c.name = 'UserID'

Есть ли способ выполнить эти операторы?

1 Ответ

7 голосов
/ 15 мая 2019

Как я уже упоминал в моих комментариях, для этого вам нужно использовать динамический SQL.Один из способов будет следующим:

DECLARE @newID int = 149080; --Changed datatype, I assume correct
DECLARE @oldID int = 146423; datatype, I assume correct

DECLARE @SQL nvarchar(MAX);

SET @SQL = STUFF((SELECT NCHAR(13) + NCHAR(10) + 
                         N'UPDATE ' + QUOTENAME(s.[name]) + N'.' + QUOTENAME(t.[name]) + N' SET ' + QUOTENAME(c.[name]) + N'= @NewID WHERE ' + QUOTENAME(c.[name]) + N' = @OldID;'
                  FROM sys.columns c
                       JOIN sys.tables t ON c.object_id = t.object_id
                       JOIN sys.schemas s ON t.schema_id = s.schema_id
                  WHERE c.[name] = N'UserID'
                  FOR XML PATH(''),TYPE).value('.','nvarchar(MAX)'),1,2,N'');

PRINT @SQL; --Your best friend for debugging
--SELECT @SQL; --If @SQL has a value more than 4,000 characters
EXEC sp_executesql @SQL, N'@NewID int, @OldID int', @NewID = @newID, @OldId = @oldID;

PRINT и SELECT помогут вам в отладке.Но, как я уже говорил в комментариях, вы, возможно, захотите посмотреть здесь ограничения внешнего ключа.

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