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)
你不需要一个你想要的循环。动态 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 您应该创建一个物理表 - 这将是更新语句的驱动程序表,并且如果您想要更新其他表,只需在您想要修改或插入更多值时更新该表。
| 归档时间: |
|
| 查看次数: |
264 次 |
| 最近记录: |