循环执行的通用表名称

时间:2018-07-05 09:14:44

标签: sql-server

我有一个数据库,其中有很多公司。我想做的是,我想将数据从不同的数据库插入到每个公司的表中,该数据库中也有相同的公司和表。我使用包含公司名称的表创建了一个循环,在该循环中,我想通过循环生成表名从一个数据库插入另一个数据库。我创建了一个循环,在其中提供了公司名称,但是找不到使用结果生成对象名称的方法。我的查询就像;

declare @Rowcount int 
select @Rowcount=count(*) from [DB_1].[dbo].[Companies];

while( @Rowcount>0)
begin 

//Begin Insert Data From DB_1 to DB_2 with sames company names
INSERT INTO [DB_1].[dbo].[**[DB_1].[dbo].[Companies].[CompanyName]**$SomeTable]           
       ([Field_1],
        [Field_2])
SELECT
        [Field_1],
        [Field_2]
FROM [DB_2].[dbo].[**[DB_1].[dbo].[Companies].[CompanyName]**$SomeTable]
//End Insert Data From DB_1 to DB_2 with sames company names

SELECT @Rowcount=@Rowcount-1;  
SELECT Name FROM [DB_1].[dbo].[Companies] order by Name desc OFFSET @Rowcount ROWS FETCH NEXT 1 ROWS ONLY;
end 

因此,基本上我无法找到一种方法来生成[DB_1]。[dbo]。[Companies]。[CompanyName]作为要在插入查询中使用的变量。

如果您能向我展示如何在循环中生成公司名称并将其在插入查询中使用,我会感到非常高兴。

感谢和问候, 阿拉拉特(Ararat)

1 个答案:

答案 0 :(得分:0)

声明一个变量,该变量将包含一个表名: declare @table_name nvarchar(200)

声明一个将包含执行查询的变量: declare @query nvarchar(2000)

在循环中解析table_name变量。对于可以建议两个实例:

  1. set @table_name = "some pattern" + sysdatetime()

  2. set @table_name = "some pattern" + @Rowcount

这两种方法都是好的,因为它保证了表的唯一名称。

然后,解析@query变量并执行查询:

...
@query = "INSERT INTO " + @table_name +       " ([Field_1],
        [Field_2])
SELECT
        [Field_1],
        [Field_2]
FROM [DB_2].[dbo].[**[DB_1].[dbo].[Companies].[CompanyName]**$SomeTable]
//End Insert Data From DB_1 to DB_2 with sames company names"

exec sp_executesql @query
...

仅供参考

我想引起您注意,名为rowcount的变量会引起混淆。在MS SQL中,存在系统变量@@rowcount,该变量返回受最后一条语句影响的行数。 有关更多信息,请参见文档:https://docs.microsoft.com/en-us/sql/t-sql/functions/rowcount-transact-sql?view=sql-server-2017