Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 我可以同时对多个数据库应用update语句吗?_Sql Server - Fatal编程技术网

Sql server 我可以同时对多个数据库应用update语句吗?

Sql server 我可以同时对多个数据库应用update语句吗?,sql-server,Sql Server,假设我要运行以下操作: update users set age = 10 关于数据库: db1, db2, db3 在同一台服务器上,我希望循环并执行相同的操作 目前,我正在通过下拉菜单使用ManagementStudio手动执行此操作 希望有更好的方法。不确定是否“动态”执行,即在服务器中的所有数据库上执行FOR-EACH样式的循环,但这应该可以: USE db1 update users set age = 10 GO USE db2 update users set a

假设我要运行以下操作:

update users set age = 10
关于数据库:

db1, db2, db3
在同一台服务器上,我希望循环并执行相同的操作

目前,我正在通过下拉菜单使用ManagementStudio手动执行此操作


希望有更好的方法。

不确定是否“动态”执行,即在服务器中的所有数据库上执行FOR-EACH样式的循环,但这应该可以:

USE db1
    update users set age = 10
GO
USE db2
   update users set age = 10
GO
USE db3
    update users set age = 10

将一台服务器指定为中央管理服务器,然后将其他服务器添加到服务器组。然后,您可以在组内的所有数据库上运行更新

您可能可以使用动态SQL来实现这一点。大概是这样的:

create table #dbs (db_name sysname not null)
insert into #dbs values ('db1'),('db2'),('db3')

declare curs cursor for
select db_name from #dbs
declare @db sysname, @sql nvarchar(max)
open curs

while(1=1)
begin
   fetch next from curs into @db
   if (@@fetch_status <> 0)
      break
   set @sql = 'update ' + quotename(@db) + '.dbo.users set age = 10'
   exec(@sql)
end
close curs
deallocate curs
drop table #dbs

您正在使用哪个版本的SQL server?这属于数据库管理员SE。呵呵,好的想法是有一个循环,这是重复的脚本,我想避免维护的原因,但谢谢!这将允许您在多个服务器上运行语句,但不能在多个数据库上运行语句。多个服务器=多个数据库:每个服务器上的数据库需要命名相同,但如果它们是相同的,则这是要使用的解决方案。这是我发现的有选择地更新多个数据库的最佳/最安全的方法。
use [WWAUTHxxx__]  -- a db containing active databases.
set nocount on
declare @Catalog as nvarchar(32)
declare @LibraryName as varchar(255)
declare @dbtable as varchar(50)
declare @retval as nvarchar(50)
declare @sSQL as nvarchar(max)
declare @parmdef as nvarchar(500)
declare @retvalout as nvarchar(50)
Declare Library_Cursor Cursor for
   select  top(1000)    xCatalog, xLibraryName
          from Active_DBs  
order by xcatalog
    Open Library_Cursor;
Fetch Next from Library_Cursor  into @Catalog, @LibraryName
   while @@Fetch_status = 0
       begin
         set @dbTable = @Catalog + '.dbo.las_circperiods' 
         set @ParmDef = N'@retvalOUT int OUTPUT';
         set @sSQL = N'Select @retvalout =  count(*) from ' + @dbtable
              + ' where xlastcircdate is null'
        exec sp_executesql @ssql,@parmdef,@retvalout=@retval output


     if @retval > 0  -- check/print Sql and then activate.
                     -- I like checking to see the potentially affected databases.
           begin 
              print @Catalog   + ',' +  @LibraryName + ',' + @retval 
              set @ssql = N'update ' + @dbTable 
                + ' set xlastcircdate = ''''  '
                + ' where xlastcircdate is null'

        --  print @ssql  -- View what you might will do
       exec sp_executesql @ssql    -- Do it.
            end

         Fetch Next from Library_Cursor  into @Catalog, @LibraryName
       end;
     close Library_cursor
     Deallocate Library_cursor