如何使用基于变量(参数)的存储过程在同一服务器中使用两个不同的数据库执行相同的查询?
由于我使用它的方式,这必须在存储过程中完成。信息存储在两个数据库的相同表名中。我需要基于变量的结果是动态的。如果输入X变量,则需要从databaseA读取,但如果输入Y,则需要从databaseB读取。
我现在所拥有的是一个可行的查询,每次都会更改dbo。我花了很多时间寻找答案,但我找不到任何东西。任何人都可以帮助我开始吗?
答案 0 :(得分:4)
您可以使用参数并检入where子句,并决定从哪个数据库表中选择数据来试试这个
--assuming both tables have same table structure
select * from database1.dbo.table where 'x' = @param1
union all
select * from database2.dbo.table where 'y' = @param1
或
if (@param1 = 'x')
begin
select * from database1.dbo.table
end
else if (@param1 = 'y')
begin
select * from database2.dbo.table
end
答案 1 :(得分:1)
另一个选项是动态SQL。
DECLARE @sql NVARCHAR(MAX) = N'SELECT
col FROM [Database'
+ CASE @param WHEN 'X' THEN 'A' ELSE 'B' END + '].dbo.table
WHERE ...';
EXEC sp_executesql @sql;
如果你正在连接,请说:
+ ' WHERE somecol <= dateadd(DAY, 1, ' + @DATE + '))';
然后是的,你会得到一个错误(但不是你指出的错误)。很难说你的pastebin代码中的哪个位置出现错误,因为它没有任何动态SQL。但是,您应该使用强类型参数,而不是上述模式,例如
DECLARE @date DATE = '2013-03-11'; -- no m/d/y ugliness please
DECLARE @sql NVARCHAR(MAX) = N'SELECT
col FROM [Database'
+ CASE @param WHEN 'X' THEN 'A' ELSE 'B' END + '].dbo.table
WHERE somecol <= dateadd(DAY, 1, @date_param))';
EXEC sp_executesql @sql, N'@date_param DATE', @date;
我更改了变量名称,以便您了解它是如何传入的。
编辑您要尝试整理的新品牌,您需要更改:
EXEC sp_executesql @SQL, N'@date_param DATE', @DATE;
要:
EXEC sp_executesql
@SQL, -- unparameterized command
N'@USERID VARCHAR(100), @OURORDERDATE DATE', -- param list
@USERID, -- param 1
@OURORDERDATE; -- param 2
解开更多纱线并拔出更多牙齿,假设用户X和Y在数据库1中而其他人在数据库2中,可能就在此之后:
DECLARE @sql NVARCHAR(MAX) = N'USE Database'
+ CASE WHEN @UserID IN ('X','Y') THEN '1' ELSE '2' END
+ ';';
SELECT ...all the join stuff from your pastebin...
WHERE (TABEL2.SOLDTOCUSTID = @USERID)
and TABEL2.OURORDERDATE >= DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0)
and (TABEL2.OURORDERDATE <= dateadd(day, 1, @OURORDERDATE));';
EXEC sp_executesql
@SQL, -- unparameterized command
N'@USERID VARCHAR(100), @OURORDERDATE DATE', -- param list
@USERID, -- param 1
@OURORDERDATE; -- param 2
答案 2 :(得分:1)
您需要的是 4部分命名约定和动态构建您的查询语句。此外,如果您的数据库不在同一台服务器上,则需要链接服务器或使用 OpenRowset。
假设:您的数据库位于同一服务器上,然后在您的存储过程中,您将需要一个参数来接受数据库名称@dbname。
declare @sql varchar(max)
set @sql = 'select * from '+ @dbname + '.dbo.tablename'
exec(@sql)
如果您的数据库位于不同的服务器中,则首先创建链接服务器,然后使用链接服务器,或直接使用openrowset。在您的商店程序中,您将需要@serverName和@DBName
declare @sql varchar(max)
set @sql = 'select * from ' + @ServerName + '.' + @DBName + '.dbo.tablename'
exec(@sql)
注意:此处,@ servername是您创建链接服务器名称时的名称。