Это работает на меня:
@echo OFF
setlocal ENABLEEXTENSIONS
set KEY_NAME="HKEY_CURRENT_USER\Software\Microsoft\Command Processor"
set VALUE_NAME=DefaultColor
FOR /F "usebackq skip=4 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
set ValueName=%%A
set ValueType=%%B
set ValueValue=%%C
)
if defined ValueName (
@echo Value Name = %ValueName%
@echo Value Type = %ValueType%
@echo Value Value = %ValueValue%
) else (
@echo %KEY_NAME%\%VALUE_NAME% not found.
)
usebackq
необходим начиная с команды к REG QUERY
двойные кавычки использования.
skip=4
игнорирует весь вывод за исключением строки, которая имеет имя значения, введите и оцените, если это существует.
2^>nul
препятствует тому, чтобы текст ошибки появился. ^
символ ESC, который позволяет Вам поместить >
в эти for
команда.
, Когда я выполняю сценарий выше, как дали, я получаю этот вывод:
Value Name = DefaultColor
Value Type = REG_DWORD
Value Value = 0x0
, Если я изменяю значение [1 110] к [1 111] тогда, я получаю это:
"HKEY_CURRENT_USER\Software\Microsoft\Command Processor"\BogusValue not found.
Проблема возникает из-за того, что временная папка пользователя, под которой запущена служба SQL-сервера, недоступна под учетными данными, с которыми выполняется запрос. Попробуйте установить безопасность этой временной папки с минимальными ограничениями. DNS, который создается каждый раз, когда вы запускаете запрос openrowset, затем может быть воссоздан без конфликта учетных данных. Это сработало для меня без каких-либо требований к перезагрузке.
В конце концов мы перезапустили сервер базы данных, и это, похоже, решило проблему. Может, файлы как-то блокировались. Однако мы никогда не узнаем наверняка
/* Linked server between local(Client) SQL server and Remote SQL server 2005*/
USE master
GO
-- To use named parameters: Add linked server in the source (Local machine - eg: MachineName or LocalSeverLoginName)
sp_addlinkedserver
@server = N'LnkSrv_RemoteServer_TEST',
@srvproduct=N'', -- Leave it blank when its not 'SQL Server'
@provider=N'SQLNCLI', -- see notes
@datasrc=N'RemoteServerName',
@provstr=N'UID=sa;PWD=sa;'
--,@catalog = N'MYDATABASE' eg: pubs
GO
/*
Note:
To check provider name use the folling query in the destination server
Select Provider From sys.servers
*/
----------------------------------------------------------------------------------------------------------
-- Optional
--EXEC sp_addlinkedsrvlogin 'LnkSrv_RemoteServer_TEST', 'true' -- (self is true) -- for LocalSeverLoginName
--GO
-- Remote login
sp_addlinkedsrvlogin
@rmtsrvname = 'LnkSrv_RemoteServer_TEST',
@useself = 'False',
@rmtuser = 'sa',
@rmtpassword = 'sa'
GO
-- OR
/*
IF the above add linked server login failed then try in the Linked Server (LnkSrv_RemoteServer_TEST) Property
Select -> Security - > 'For a login not defined in the list above, Connection will:'
Choose - > Be made using this security context
SET Remote login: sa
With password: sa
*/
----------------------------------------------------------------------------------------------------------
-- Test server connection
declare @srvr nvarchar(128), @retval int;
set @srvr = 'LnkSrv_RemoteServer_TEST';
begin try
exec @retval = sys.sp_testlinkedserver @srvr;
end try
begin catch
set @retval = sign(@@error);
end catch;
if @retval <> 0
raiserror('Unable to connect to server. This operation will be tried later!', 16, 2 );
-- OR
BEGIN TRY
EXEC sp_testlinkedserver N'LnkSrv_RemoteServer_TEST';
END TRY
BEGIN CATCH
PRINT 'Linked Server not available';
RETURN;
END CATCH
----------------------------------------------------------------------------------------------------------
-- Get access linked server database
SET xact_abort ON
GO
BEGIN TRANSACTION
SELECT * FROM LnkSrv_RemoteServer_TEST.DBName.dbo.tblName
COMMIT TRAN
GO
-- OR
SELECT * FROM OPENQUERY(LnkSrv_RemoteServer_TEST, 'SELECT * FROM DBName.dbo.tblName')
GO
-- OR
SELECT * FROM OPENQUERY(LnkSrv_RemoteServer_TEST, 'SELECT * FROM sys.databases Order by name')
GO
----------------------------------------------------------------------------------------------------------