对不同的表执行相同的SQL语句

Kev*_* M. 4 sql-server t-sql sql-server-2008-r2

我有一个从多个表中删除数据的存储过程。除了表名外,SQL 都是一样的。

UPDATE desttable
SET desttable.reportarea = esz2reportarea.reportarea
FROM table1 AS desttable JOIN esz2reportarea ON desttable.subdivisn = esz2reportarea.esz
WHERE desttable.reportarea = ''

UPDATE desttable
SET desttable.reportarea = esz2reportarea.reportarea
FROM table2 AS desttable JOIN esz2reportarea ON desttable.subdivisn = esz2reportarea.esz
WHERE desttable.reportarea = ''

...

UPDATE desttable
SET desttable.reportarea = esz2reportarea.reportarea
FROM table10 AS desttable JOIN esz2reportarea ON desttable.subdivisn = esz2reportarea.esz
WHERE desttable.reportarea = ''
Run Code Online (Sandbox Code Playgroud)

我想重写它以使用某种循环,以便 SQL 只编写一次。(这是针对 SQL Server 2008R2。)

需要更新的表列表将保持不变;如果要更新的表列表有任何更改,那将是由于应用程序升级,我必须重新确定当时需要修改哪些表。要更新的表列表将放入临时表中。

SELECT * INTO #tablenames
FROM (VALUES ('table1'), ('table2'), ('table3')) AS tables(tablename)
Run Code Online (Sandbox Code Playgroud)

Kin*_*hah 6

你不需要一个你想要的循环。动态 SQL 将帮助您实现您想要的。

SELECT * INTO #tablenames
FROM (VALUES ('table1'), ('table2'), ('table3')) AS tables(tablename)

--select * from #tablenames



declare @sqltext nvarchar(max) = N''
select @sqltext += 'UPDATE  desttable
SET desttable.reportarea = esz2reportarea.reportarea
FROM '+quotename(tablename)+ ' table1 AS desttable JOIN esz2reportarea ON desttable.subdivisn = esz2reportarea.esz
WHERE desttable.reportarea = '''';'+char(10)
from #tablenames  
order by tablename

print @sqltext

-- once you review the above print statement and are HAPPY, uncomment the below part. 
-- Below part will actually RUN the UPDATE statement ... 
-- exec sp_executesql @sqltext
Run Code Online (Sandbox Code Playgroud)

注意:我同意@AaronBertrand 您应该创建一个物理表 - 这将是更新语句的驱动程序表,并且如果您想要更新其他表,只需在您想要修改或插入更多值时更新该表。