0

Попытка обновить таблицу на связанном сервере (SQL 2000/2005), но мое имя сервера не будет известно заранее. Я пытаюсь это:Полноценные имена таблиц с SP_ExecuteSql для доступа к удаленному серверу

DECLARE @Sql NVARCHAR(4000) 
DECLARE @ParamDef NVARCHAR(4000) 
DECLARE @SERVER_NAME VARCHAR(35) 

SET @Sql = 'UPDATE 
@server_name_param.dba_sandbox.dbo.SomeTable 
SET SomeCol=''data''' 

SET @ParamDef = N'@server_name_param VARCHAR(35)' 

print @Sql 

exec sp_executesql @Sql, @ParamDef, @[email protected]_NAME 

Который возвращает это:

UPDATE 
@server_name_param.dba_sandbox.dbo.SomeTable 
SET SomeCol='data' 
Msg 170, Level 15, State 1, Line 2 
Line 2: Incorrect syntax near '.'. 

Любые идеи? В любом случае я рассматриваю оператор SQL, который выполняется после привязки параметров?

ответ

4

Вы должны будете сделать это , она не может быть параметризируются

.... 
SET @Sql = 'UPDATE ' + @server_name_param + '.dba_sandbox.dbo.SomeTable SET SomeCol=''data''' 
.... 

Edit: Существует еще один способ, который я использовал еще в моих чистых DBA дней

EXEC sp_setnetname 'AdhocServer', @SERVER_NAME 
UPDATE AdhocServer.dba_sandbox.dbo.SomeTable SET SomeCol 'data' 
EXEC sp_setnetname 'AdhocServer', 'MeaninglessValue' 

sp_setnetname есть от SQL Server 2000 по 2008 год

Редактировать2. Permissions:

Попробуйте EXECUTE AS LOGIN = 'login_name', где login_name является суперпользователем

Я не использовал это (я использую "AS USER" для тестирования), так что не уверен в тонкостях ...

Редактирование 3: для параллелизма рассмотрите использование sp_getapplock и хранимой процедуры или какой-либо другой механизм управления параллелизмом.

+0

Ваш eddit фактически отвечает на проблему moreso, чем на вопрос. Выполнение этого способа позволяет мне выполнить мой запрос, даже не используя никакой параметризации или dyanmic sql. Фантастика! – Dlongnecker

+0

О, но неудобно в соответствии с msdn. Это требует членства в строках сервера sysadmin и setupadmin. - роли, которые мы действительно не хотим применять к пользователю приложения. – Dlongnecker

0

Вы не можете сделать это с помощью параметров напрямую - вам придется использовать динамический SQL, или отправить имя сервера в качестве параметра к SP, который делает динамический SQL:

DECLARE @template NVARCHAR(4000) 
DECLARE @Sql NVARCHAR(4000) 
DECLARE @SERVER_NAME VARCHAR(35) 

SET @template = 'UPDATE {@server_name_param}.dba_sandbox.dbo.SomeTable SET SomeCol=''data''' 
SET @sql = REPLACE(@template, '{@server_name_param}', @SERVER_NAME) 

print @Sql 

exec sp_executesql @Sql -- OR EXEC (@sql) 
0

Мне нравится трюк gbn. Я не знал этого, и мне придется исследовать его еще.

Поскольку я не знал этого трюка, мне приходилось использовать динамический sql в подобных ситуациях в прошлом (например, что сделал Кейд). Когда это произойдет, я обычно запрашиваю представление схемы данных, чтобы убедиться, что значение параметра является реальным объектом базы данных перед построением запроса. Таким образом, я уверен, что это не попытка инъекции.

 Смежные вопросы

  • Нет связанных вопросов^_^