我在使用此查询时遇到麻烦...知道如何声明变量并使它对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]的连接。
答案 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;