2012-10-11 11 views
10

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).Aktualizacja dynamiczna o zmiennych nazwach kolumn

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

Odpowiedz

12

Można podać nazwę kolumny w dynamicznym SQL:

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

exec sp_executesql @sql; 
+3

Proszę [zawsze używaj 'nazwa_typu'] (http://stackoverflow.com/a/6285111/11683) wokół nazw dynamicznych obiektów. – GSerg

+2

@GSerg +1 dla wzmianki o '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

2

Możesz zajrzeć do tabeli sys.columns i dołączyć 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żna użyć pola name z kwerendy sys.columns jako podstawa do przeprowadzenia aktualizację.

1

Zakładając chcesz wszystkie kolumny tylko typów VARCHAR/CHAR (lub zmienić filtr typu na co trzeba):

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) 
Powiązane problemy