如何使用基于变量(参数)的存储过程在同一服务器中使用两个不同的数据库执行相同的查询?
由于我使用它的方式,这必须在存储过程中完成。信息存储在两个数据库上的相同表名中。我需要基于变量的结果是动态的。如果输入 X 变量,则需要从数据库 A 中读取,但如果输入 Y,则需要从数据库 B 中读取。
我现在所拥有的只是一个有效的查询,每次都会更改 dbo。我花了很多时间寻找答案,但我找不到任何东西。谁能帮我开始?
如何使用基于变量(参数)的存储过程在同一服务器中使用两个不同的数据库执行相同的查询?
由于我使用它的方式,这必须在存储过程中完成。信息存储在两个数据库上的相同表名中。我需要基于变量的结果是动态的。如果输入 X 变量,则需要从数据库 A 中读取,但如果输入 Y,则需要从数据库 B 中读取。
我现在所拥有的只是一个有效的查询,每次都会更改 dbo。我花了很多时间寻找答案,但我找不到任何东西。谁能帮我开始?
您可以使用参数并检查 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
您需要的是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 是您创建链接服务器时的名称。
另一种选择是动态 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 在 database1 中,其他用户在 database2 中:
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