Обновить столбцы в нескольких таблицах по именам, извлеченным из временной таблицы - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть временная таблица, в которой хранятся различные имена таблиц и имена связанных столбцов. Если бы я запустил на нем простой SELECT, результаты выглядели бы примерно так:

----------------
TableName |  ColumnName
------------------
Users     |  RoleId
Tables    |  OwnerId
Chairs    |  MakerId
etc...

Я ищу способ установить значения упомянутых столбцов в связанных таблицах в NULL.

Я знаю, как сделать это с помощью цикла CURSOR или WHILE, обрабатывая каждую строку отдельно, но я пытаюсь устранить эти факторы производительности из моих хранимых процедур. Есть ли способ построить объединение по именам таблиц из столбца TableName с фактическими таблицами, чтобы затем установить значения подключенного столбца ColumnName в NULL?

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Попробуйте,

IF OBJECT_ID('SampleTable') IS NOT NULL
    DROP TABLE SampleTable

CREATE TABLE SampleTable
(
Table_Name VARCHAR(50) NOT NULL,
Column_Name VARCHAR(50) NOT NULL
)
GO

INSERT INTO SampleTable
VALUES
('Users','RoleId'),('Tables','OwnerId'),('Chairs','MakerId')
,('Users','Appid'),('Tables','Column') --Give your Combo here
GO


declare @Sql nvarchar(1000)=''
;with CTE as
(
select QUOTENAME(a.Table_Name)Table_Name
,stuff((select ','+QUOTENAME(Column_Name),'=null' 
from SampleTable B 
where a.Table_Name=b.Table_Name for xml path('') ),1,1,'')UpdateCol
from SampleTable A
group by a.Table_Name
)

select @Sql=coalesce(@Sql+char(13)+char(10)+SingleUpdate,SingleUpdate)
from
(
select CONCAT('Update ',Table_Name,' ','SET ',UpdateCol)SingleUpdate
from cte
)t4

print @Sql
select @Sql
Execute sp_executeSql @Sql
1 голос
/ 30 сентября 2019

Проверить этот скрипт-

IF OBJECT_ID('SampleTable') IS NOT NULL
    DROP TABLE SampleTable

CREATE TABLE SampleTable
(
Table_Name VARCHAR(50) NOT NULL,
Column_Name VARCHAR(50) NOT NULL
)
GO

INSERT INTO SampleTable
VALUES
('Users','RoleId'),('Tables','OwnerId'),('Chairs','MakerId') --Give your Combo here
GO

--Check this scripts
SELECT 'UPDATE ' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(S1.TABLE_NAME) +
       ' SET ' + QUOTENAME(S1.COLUMN_NAME) + ' = NULL ; '
AS [Dynamic_Scripts]
FROM SampleTable S JOIN INFORMATION_SCHEMA.COLUMNS S1 ON s.Table_Name=s1.Table_Name and s.Column_Name=s1.Column_Name

--Check this scripts (multiple column single script; 1 table 'n' column - 1 update query)
SELECT 'UPDATE ' + CONCAT('[',TABLE_SCHEMA,'].[',S1.TABLE_NAME,'] SET ') + STRING_AGG(CONCAT('[',S1.COLUMN_NAME,']=NULL'),',') + ' ; ' AS [Dynamic_Scripts]
FROM SampleTable S JOIN INFORMATION_SCHEMA.COLUMNS S1 ON s.Table_Name=s1.Table_Name and s.Column_Name=s1.Column_Name
GROUP BY CONCAT('[',TABLE_SCHEMA,'].[',S1.TABLE_NAME,'] SET ')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...