我有一个存储过程,负责将数据从数据库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.
答案 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)
准确
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)