SQL Server-使用参数时出现OPENROWSET服务器名称错误
我在这个查询中遇到了问题…知道如何声明变量并使其对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
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
表达式中的数据类型。我对您的解决方案做了一点更改,但我得到了!!干杯,伙计