Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-使用参数时出现OPENROWSET服务器名称错误_Sql_Sql Server_Openrowset - Fatal编程技术网

SQL Server-使用参数时出现OPENROWSET服务器名称错误

SQL Server-使用参数时出现OPENROWSET服务器名称错误,sql,sql-server,openrowset,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 OPENR

我在这个查询中遇到了问题…知道如何声明变量并使其对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]


这是变量的声明:

DECLARE @SERVERNM VARCHAR(100)

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

不能在文本字符串中使用变量。在您的连接中,您表示要连接到实际名为
“@SERVERNM”
的服务器,而不是
@SERVERNM
的值。此外,您还有
声明@SERVERNM VARCHAR
,这与
声明@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;
解决方案:

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;

您在您呼叫的服务器上设置了可信连接吗?您运行此查询的用户是否具有访问这两个对象的权限?您在此处声明了许多varchar,但没有一个具有指定的长度。不要依赖默认值,要具体。您知道默认长度可以根据您的使用方式进行更改吗@ENT\u NR\u VERSAO是Sp P750106119中的一个变量,因此我不需要声明它,只需设置即可。这不会解决
'SERVER=@SERVERNM;受信任的\u连接=是;'。与某些语言不同,T-SQL不会将文本字符串中的变量名内联替换为变量值<代码>声明@var varchar(10)=“abc”;选择'123@var';
不会返回
'123abc'
,它会返回
'123@var“
。另外,您应该将声明长度的逻辑不仅应用于变量声明,还应用于
CAST
表达式中的数据类型。我对您的解决方案做了一点更改,但我得到了!!干杯,伙计