1

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

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

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

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

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

问题
2.您如何看待我的解决方案?

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.
4

3 回答 3

2

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

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

您可以在普通表前面加上 Temp_ 之类的东西,只是为了注意它们是临时表,然后确保在每个查询的开头删除它们,即

DROP TABLE TEMP_Table

您可以通过执行调用多个本地数据库

SELECT * FROM [DatabaseName].dbo.[TableName]
于 2013-01-30T08:40:30.580 回答
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

拉吉

于 2013-01-30T09:22:45.720 回答
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)
于 2013-01-30T08:57:41.720 回答