要求:我们过去常常将10到50个表名(来自不同架构和服务器(使用链接服务器))作为从Prod到测试或开发环境的刷新请求。
Ex:我们在prod中有3个架构,称为dbo,Schema1和Schema 2,在其他环境中我们有不同的架构名称,如schemaC和SchmaD等。
为此,我使用以下脚本以单引号获取表名。
第1步:
声明@String Varchar(8000)=' schemaname.table1,schemaname.table2,schemname.table1s45k'
设置@String ='''' +替换(@String,',',''',''')+'&#39 ;''
选择@String
步骤2:我将备份bkpdata基表中的现有表格数据。
第3步:我将截断备份表
步骤4:我将借助链接服务器ex:在开发框中将数据从Production移动到dev / test环境
插入到databasename.schemaname.tablename中select * from linkedservername.schemaname.tablename
如果我们能够获得带有参数工具的动态SQL代码作为表名,数据库名,链接服务器名和模式名称工具,那将是很棒的。
任何其他选项也受到高度赞赏。
添加其他详细信息:
声明@String Varchar(8000)=' schema1.rnd,schema2.test'
设置@String ='''' +替换(@String,',',''',''')+'&#39 ;''
声明@Strings表(名称varchar(max)) 插入@strings 选择@String
从sys.tables中选择'截断表' +'' +名称中的名称(从@strings中选择名称)
它将结果显示为Truncate表Tablename。所以我不想执行结果,它必须自己执行输出。我猜动态SQL会有所帮助。
答案 0 :(得分:1)
--@String contains location where to(db.schema.tablenm) copy and where from(servevr.dbb.schema.tablenm)
--At the end of each copy and copy from need to provide , as delimeter
--copy to and copy from is seprated by |
Declare @String Varchar(8000) =
'db.schema.tablenm|servevr.dbb.schema.tablenm,
db1.schema1.tablenm1|servevr1.db1.schema1.tablenm1,
db2.schema2.tablenm2|servevr2.db2.schema2.tablenm2,
'
Declare @str Varchar(8000)
Declare @execStr Varchar(8000)
Declare @delimeterocc int
Declare @delimeterSer int
declare @start int
set @start=0
Set @delimeterocc=charindex(',',@String)
While(@delimeterocc>0)
begin
set @str=SUBSTRING(@String,@start,len(@string)-(len(@String)-@delimeterocc)-@start)
Set @delimeterSer=charindex('|',@str)
print 'Insert Into ' + SUBSTRING(@str,1,@delimeterSer-1) + ' Select * From '+ SUBSTRING(@str,@delimeterSer+1,len(@str)-@delimeterSer)
Set @start=@delimeterocc+1
Set @delimeterocc=charindex(',',@String,@start)
end