Pytanie Dynamiczna aktualizacja ze zmiennymi nazwami kolumn


Szukamy aktualizacji w kilku bazach danych SQL Server, aby zmienić wszystkie wartości NULL w pewnej tabeli na puste ciągi zamiast NULL. Potencjalnie zamierzamy to zrobić w setkach baz danych. Nazwa tabeli będzie zawsze taka sama, ale nazwy kolumn są zmienne w zależności od konfiguracji aplikacji front-end (nie oceniaj ... Nie stworzyłem tego systemu).

Czy istnieje sposób na aktualizację wszystkich tych kolumn bez znajomości nazw kolumn przed czasem?


11
2017-10-11 19:04


pochodzenie




Odpowiedzi:


Możesz przekazać nazwę kolumny w dynamicznym sql:

declare @sql nvarchar (1000);
set @sql = N'update table set ' + @column_name + '= ''''';

exec sp_executesql @sql;

13
2017-10-11 19:30



Proszę zawsze używaj quotename wokół dynamicznych nazw obiektów. - GSerg
@GSerg +1 za wzmiankę quotename(). Powiem, że jego użycie tutaj wydaje się nieco zbyteczne, biorąc pod uwagę, że było to tylko w przypadku niektórych wewnętrznych DML. Jeśli byłby to sproc do wykonania przy wprowadzeniu przez użytkownika z publicznej (lub piekielnej, nawet wewnętrznej) strony, byłbym w całości. - CaptainMarvel


Możesz zajrzeć do sys.columns tabela i dołącz do nazwy tabeli lub id_obiektu.

 DECLARE @OBJ_ID INT

 SELECT @OBJ_ID = OBJECT_ID
 FROM SYS.tables
 WHERE name = 'YOURTABLE'

 SELECT * FROM SYS.columns
 WHERE OBJECT_ID = @OBJ_ID

Możesz użyć name pole z zapytania sys.columns jako podstawę do wykonania aktualizacji.


2
2017-10-11 19:07





Zakładając, że chcesz wszystkie kolumny typów varchar / char (lub zmienić filtr typów na cokolwiek potrzebujesz):

DECLARE @tableName varchar(10)
SET @tableName = 'yourtablenamehere'

DECLARE @sql VARCHAR(MAX)
SET @sql = ''

SELECT @sql = @sql + 'UPDATE ' + @tableName + ' SET ' + c.name + ' = '''' WHERE ' + c.name + ' IS NULL ;'
FROM sys.columns c
INNER JOIN sys.tables t ON c.object_id = t.object_id
INNER JOIN sys.types y ON c.system_type_id = y.system_type_id
WHERE t.name = @tableName AND y.name IN ('varchar', 'nvarchar', 'char', 'nchar')

EXEC (@sql)

2
2017-10-11 20:07