SQL Server-使用参数的OPENROWSET服务器名称错误

时间:2019-03-18 18:35:05

标签: sql sql-server openrowset

我在使用此查询时遇到麻烦...知道如何声明变量并使它对OPENROWSET查询可见吗?

  DECLARE @SERVERNM VARCHAR;

  SET @SERVERNM = (SELECT(CAST(CONNECTIONPROPERTY('local_net_address') AS VARCHAR) + '\' + CAST(SERVERPROPERTY('InstanceName') AS VARCHAR)))

  SELECT 
      * 
  FROM
      OPENROWSET('SQLOLEDB','SERVER=@SERVERNM;Trusted_Connection=yes;',
  'set fmtonly off;exec DW..P750106119 @ENT_NR_VERSAO=1')

错误:

  

命名管道提供者:无法打开与SQL Server [53]的连接。

3 个答案:

答案 0 :(得分:1)

这是变量的声明:

DECLARE @SERVERNM VARCHAR(100)

SET @SERVERNM = (SELECT(CAST(CONNECTIONPROPERTY('local_net_address') AS VARCHAR)+'\'+CAST(SERVERPROPERTY('InstanceName') AS VARCHAR)))

答案 1 :(得分:1)

您不能在文字字符串中使用变量。在连接中,您要连接到实际称为"@SERVERNM"的服务器,不是 @SERVERNM的值。另外,您拥有DECLARE @SERVERNM VARCHAR,与DECLARE @SERVERNM VARCHAR(1)相同。我怀疑此可能工作正常,但是 假定 @SERVERNM的值将小于或等于128个字符:

DECLARE @SERVERNM sysname;
SELECT @SERVERNM = CAST(CONNECTIONPROPERTY('local_net_address') AS sysname)+'\'+CAST(SERVERPROPERTY('InstanceName') AS sysname);
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT *' + NCHAR(13) + NCHAR(10) +
           N'FROM OPENROWSET(''SQLOLEDB'',' + NCHAR(13) + NCHAR(10) +
           N'                ''SERVER=' + QUOTENAME(@SERVERNM,'"') + N';Trusted_Connection=yes;'',' + NCHAR(13) + NCHAR(10) +
           N'                ''set fmtonly off;exec DW..P750106119 @ENT_NR_VERSAO=1'');'
EXEC sp_executesql @SQL;

答案 2 :(得分:0)

解决方案:

DECLARE @SERVERNM sysname;
SET @SERVERNM = 'SERVER='+CAST(CONNECTIONPROPERTY('local_net_address') AS sysname)+'\'+CAST(SERVERPROPERTY('InstanceName') AS sysname)+';Trusted_Connection=yes;'
DECLARE @TEST NVARCHAR(MAX)
SET @TEST = QUOTENAME(@SERVERNM,'''')

DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT *' + NCHAR(13) + NCHAR(10) +
           N'FROM OPENROWSET(''SQLOLEDB'',' + NCHAR(13) + NCHAR(10) +
           N'                ' + @TEST + ',' + NCHAR(13) + NCHAR(10) +
           N'                ''set fmtonly off;exec DW..P750106119 @ENT_NR_VERSAO=1'');'

EXEC sp_executesql @SQL;