SQL Server - OPENROWSET Ошибка имени сервера при использовании параметров - PullRequest
1 голос
/ 18 марта 2019

У меня проблемы с этим запросом ... Есть идеи, как объявить переменные и сделать их видимыми для запроса 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 ]

1 голос
/ 18 марта 2019

Вы не можете использовать переменную внутри литеральной строки.В вашем соединении вы заявляете, что хотите подключиться к серверу, который называется "@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;
1 голос
/ 18 марта 2019

Это объявление переменных:

DECLARE @SERVERNM VARCHAR(100)

SET @SERVERNM = (SELECT(CAST(CONNECTIONPROPERTY('local_net_address') AS VARCHAR)+'\'+CAST(SERVERPROPERTY('InstanceName') AS VARCHAR)))
0 голосов
/ 18 марта 2019

РЕШЕНИЕ:

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;
...