SQL Server:如何在存储过程中声明变量

时间:2019-03-04 01:05:47

标签: sql sql-server

我需要开发一个存储过程,该存储过程具有从两个不同服务器连接表的选择查询。

示例:

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表在Server1CUSTOMER数据库上
  • ORDERLIST表在Server 2ORDER数据库上

它们是链接服务器。

此存储过程将位于Customer上的Server1数据库中。

我可以将server2设为变量吗?因为我需要用户在运行存储过程时指定服务器名称和customerid。我需要能够在生产和测试环境中执行的存储过程。还是应该怎么做?

1 个答案:

答案 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()的原因。