将servername,数据库名称和模式自动放在select语句中的表名之前

时间:2013-01-30 08:34:13

标签: sql sql-server stored-procedures

我有一个存储过程,负责将数据从数据库A导入到数据库B.我有客户,他们都有自己的数据库B(使用相同的表等)他们也有自己的数据库A.存储程序将在数据库B上执行(部署)。

问题:
 每个客户都有A和B的另一个数据库名称。我还发现数据库A可以位于不同的服务器/实例上。我需要一种通用的方法来自动地从我的存储过程中的A中放置服务器/实例名称和数据库名称,以从那里选择数据。每个客户都有一个连接到数据库A的连接字符串,它已经存在于数据库B中。因此,从connecstring,我可以得到服务器/实例名称和A的数据库名称。(我已经创建了一个链接服务器)

1。将服务器/实例名称和数据库名称放在表名之前的最佳方法是什么?

存储过程
 在我的存储过程中,我使用了很多变量(声明)表来插入数据库A中的数据。有很多关于使用动态sql的文章但是,我找不到一个带有声明表的例子。

我的解决方案
 我正在考虑将数据库A中的所有数据插入到变量表中。我从7个表导入数据,所以我需要声明7个表,并且在我的SP中我可以从我的声明表中选择数据。请注意,孔存储过程非常庞大。

问题
 你对我的解决方案有什么看法?

3.你有其他解决方案吗?

4.如何使用动态sql插入我的声明表?

**请注意我使用的是sql server 2005。

 I have a few statements like below:

 declare @Temp table (Id int, etc
 insert into @Temp (Id, etc)
 Select Id, etc
 From [databasename].dbo.TableName   //hardcoded
 Where .......

 // doing staff like selecting from the @Temp table etc.


I also have subqueries, but I can change if it is necessary.

3 个答案:

答案 0 :(得分:2)

您无法使用动态sql进入声明表,因为临时表仅在会话中可用。执行任何新的sql,即通过动态sql将创建一个新的会话。

您可以通过不使用任何声明或临时表来改变它,而是使用普通表。动态sql可以访问它,你所做的任何事情都不会丢失。

您可以在普通表之前添加类似Temp_的内容,只需注意它们是临时表,然后确保在每个查询的开头删除它们,即

DROP TABLE TEMP_Table

您可以通过

调用多个本地数据库
SELECT * FROM [DatabaseName].dbo.[TableName]

答案 1 :(得分:1)

不是创建#temp,而是创建它为[TempDB]。[DBO]。[Temp],它可以在动态SQL之外访问。但是,记得在完成后明确删除表

DECLARE @sql VARCHAR(200)
SET @sql = 'CREATE TABLE tempdb.dbo.temp(id INT IDENTITY(1,1), DESCRIPTION VARCHAR(100))
INSERT INTO tempdb.dbo.temp SELECT ''1'' SELECT * FROM tempdb.dbo.temp'
PRINT (@sql)
EXEC (@sql)
SELECT * FROM tempdb.dbo.temp

DROP TABLE tempdb.dbo.temp

拉​​吉

答案 2 :(得分:0)

选中此项以在动态查询中创建临时表

DECLARE @sql VARCHAR(200)
SET @sql = 'CREATE TABLE #temp(id INT IDENTITY(1,1), DESCRIPTION VARCHAR(100))
INSERT INTO #temp SELECT ''1'' SELECT * FROM #temp'
PRINT (@sql)
EXEC (@sql)

SQLFiddle

准确

DECLARE @sql VARCHAR(1000)
SET @sql = 
    'DECLARE @Temp TABLE (
                Id INT,
                etc
                INSERT INTO @Temp (Id, etc)
                SELECT Id,
                etc
                FROM [databasename].dbo.TableName / / hardcoded
                WHERE ....... SELECT * FROM @temp'

    PRINT (@sql)
EXEC (@sql)