我需要开发一个存储过程,该存储过程具有从两个不同服务器连接表的选择查询。
示例:
CREATE PROCEDURE [dbo].[test proc]
DECLARE @customerid INT
SELECT OL.CUSTOMER_ID
FROM CUSTOMERS C
JOIN SERVER2.ORDER.ORDERLIST OL ON C.ID = OL.CUSTOMER_ID
WHERE OL.CUSTOMER_ID = @customerid
CUSTOMERS
表在Server1
,CUSTOMER
数据库上ORDERLIST
表在Server 2
,ORDER
数据库上它们是链接服务器。
此存储过程将位于Customer
上的Server1
数据库中。
我可以将server2
设为变量吗?因为我需要用户在运行存储过程时指定服务器名称和customerid
。我需要能够在生产和测试环境中执行的存储过程。还是应该怎么做?
答案 0 :(得分:2)
您需要使用动态SQL:
create PROCEDURE [dbo].[test proc] (
@customerid int,
@server2 sysname -- or you can use nvarchar(255)
)
begin
declare @sql nvarchar(max);
set @sql = '
SELECT OL.CUSTOMER_ID
FROM CUSTOMERS C JOIN
@SERVER2.ORDER.ORDERLIST OL
ON C.ID = OL.CUSTOMER_ID
WHERE OL.CUSTOMER_ID = @customerid';
set @sql = replace(@sql '@SERVER2', @server2);
exec sp_executesql @sql,
N'@customerid int',
@customerid=@customerid;
end;
sp_executesql
允许您替换动态SQL中的常量值。但是,不允许您更改标识符,例如服务器名称,这就是为什么它使用replace()
的原因。