Как динамически установить имя таблицы и поля в запросе на обновление? - PullRequest
1 голос
/ 13 марта 2009

Я бы хотел просмотреть список таблиц. Для каждой таблицы я бы хотел выполнить запрос на обновление.

Код Psuedo:

ArrayOfTablesObjects = {['tablename1','fieldname1'],['tablename2','fieldname2']......}

foreach @tablename in ArrayOfTablesObjects 

UPDATE @tablename
SET  @fieldname = 'xyz'
WHERE @fieldname = '123'

end foreach

Ответы [ 3 ]

2 голосов
/ 13 марта 2009

Это может быть сделано только с использованием динамического SQL. Это очень опасный способ использования, и его никогда не следует делать, не задумываясь о том, как он может нанести вред базе данных, и как вы можете написать его более тщательно для защиты базы данных. Пожалуйста, прочтите эту статью, прежде чем подумать о написании динамического SQL. http://www.sommarskog.se/dynamic_sql.html

2 голосов
/ 13 марта 2009

Для этого вам нужно использовать динамический SQL. Функция EXEC выполнит специальный SQL-оператор, переданный в виде строки.

DECLARE @UpdateSql AS varchar(2000)

foreach @tablename in ArrayOfTablesObjects 

SET @UpdateSql = 'UPDATE ' + @tablename + ' SET ' + @fieldname ' + = ''xyz'' WHERE ' + @fieldname + ' = ''123'''
EXEC (@UpdateSql)

end foreach
0 голосов
/ 16 марта 2009

Спасибо Harpo за ваш ответ. Я использовал эту идею для построения следующего оператора SQL. У нас есть много таблиц 50+, которые имеют одинаковый тип данных (идентификатор сотрудника), но это имя поля может отличаться. Таким образом, в зависимости от имени таблицы поле, которое будет обновлено, будет другим. Мои настоящие операторы WHERE и SET более сложны, чем этот пример, но это не важно для этой проблемы.

Сначала я создаю временную таблицу для хранения таблицы / полей, которые я хочу обновить.

Затем я перебираю эти записи и генерирую SQL. Для тех из вас, кому не нравится динамический sql, вы можете просто использовать оператор print, а затем скопировать его в другое окно запроса и выполнить его. Или вы можете позвонить в оператор EXEC.

Я бы хотел принять ваши ответы, но потом не совсем ответил на мой вопрос, отчасти потому, что я не объяснил себя полностью. В любом случае, спасибо за вашу помощь.

DECLARE @TableFieldDictionary TABLE
(
    tablename VARCHAR(100),
    fieldname varchar(100)
)

insert into @TableFieldDictionary(tablename,fieldname) values ('table1','field1');
insert into @TableFieldDictionary(tablename,fieldname) values ('table2','field2');
--put more insert statements here.  In my case, I have 50 inserts


declare cursor_dictionary cursor
for select tablename, fieldname from @TableFieldDictionary

open cursor_dictionary

declare @looptablename VARCHAR(100)
declare @loopfieldname varchar(100)

fetch next from cursor_dictionary
into @looptablename,@loopfieldname

DECLARE @UpdateSql AS varchar(max)
WHILE @@FETCH_STATUS = 0
BEGIN   
    SET @UpdateSql = 'UPDATE ' + @looptablename + 
                     ' SET ' + @loopfieldname + ' = 123' +
             ' WHERE ' + @loopfieldname + ' = 456'

    print @updatesql
    --EXEC(@updatesql)

    fetch next from cursor_dictionary
    into @looptablename,@loopfieldname
END 

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