Sql 如何在更新查询中动态设置表名和字段名?

Sql 如何在更新查询中动态设置表名和字段名?,sql,sql-server,Sql,Sql Server,我想循环浏览一系列表格。对于每个表,我想运行一个更新查询 Psuedo代码: ArrayOfTablesObjects = {['tablename1','fieldname1'],['tablename2','fieldname2']......} foreach @tablename in ArrayOfTablesObjects UPDATE @tablename SET @fieldname = 'xyz' WHERE @fieldname = '123' end foreac

我想循环浏览一系列表格。对于每个表,我想运行一个更新查询

Psuedo代码:

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

foreach @tablename in ArrayOfTablesObjects 

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

end foreach

为此,您需要使用动态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

为此,您需要使用动态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

这只能使用动态SQL来完成。这是一种非常危险的技术,如果不仔细考虑它会如何损害数据库,以及如何更仔细地编写它以保护数据库,就不应该使用这种技术。在考虑编写动态SQL之前,请阅读本文。

这只能使用动态SQL完成。这是一种非常危险的技术,如果不仔细考虑它会如何损害数据库,以及如何更仔细地编写它以保护数据库,就不应该使用这种技术。在考虑编写动态SQL之前,请阅读本文。
谢谢哈波的回答。我用这个想法构建了下面的sql语句。我们有许多表50+都具有相同类型的数据(员工id),但字段名可能不同。因此,根据表名,要更新的字段将有所不同。我的实际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

谢谢哈波的回答。我用这个想法构建了下面的sql语句。我们有许多表50+都具有相同类型的数据(员工id),但字段名可能不同。因此,根据表名,要更新的字段将有所不同。我的实际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
笑吧,看来这场比赛对速度快的(打字员)来说很重要。事实上,我在笔记本电脑上浏览的时候看到了这一点,所以我跳到了我登录的地方(我不知道我的开放id)。笑吧,看来比赛是属于swift(打字员)的。事实上,我在笔记本电脑上浏览时看到了这一点,所以我跳到了我登录的地方(我不知道我的开放id)。