如何更改此函数以动态获取opendatasource服务器名称

时间:2018-05-17 23:45:40

标签: sql-server function

我创建了下一个函数,一个来自两个表的简单联合,一个来自当前服务器,另一个来自远程服务器:

ALTER FUNCTION [dbo].[fn_AllData] ()
RETURNS @tmp TABLE
    (
    Id      int,
    Name    varchar(100)
    )
AS
BEGIN
    INSERT INTO @tmp
        SELECT Id, Name 
        FROM Table1

    INSERT INTO @tmp
        SELECT Id, Name 
        FROM OPENDATASOURCE('SQLOLEDB', 'Data Source=SERVER1;user id=xxx;password=yyy').Database1.dbo.Table1

    RETURN
END

--SELECT * FROM fn_AllData()

这个功能正常。

现在我需要从另一个参数表中动态获取服务器名称。

应该很容易这样:

DECLARE @SERVERNAME as varchar(20)

SELECT @SERVERNAME = Value 
FROM Parameters 
WHERE Name = 'SERVERNAME'
[...]

INSERT INTO @tmp
    SELECT Id, Name 
    FROM OPENDATASOURCE('SQLOLEDB', 'Data Source=' + @SERVERNAME + ';user id=xxx;password=yyy').Database1.dbo.Table1

Opendatasource不接受参数。

有没有办法实现我的目标,将我的代码保存在函数中?

1 个答案:

答案 0 :(得分:0)

尝试这个,我希望这有效

DECLARE @SERVERNAME as NVARCHAR(20)
DECLARE @INSERTQUERY AS NVARCHAR(255)

SELECT @SERVERNAME=Value 
FROM Parameters WHERE Name='SERVERNAME'

[...]

SET @INSERTQUERY = 'INSERT INTO @tmp
SELECT Id, Name FROM OPENDATASOURCE(''''SQLOLEDB'''', ''''Data Source=' + @SERVERNAME + ';user id=xxx;password=yyy'''').Database1.dbo.Table1'

EXEC (@INSERTQUERY)