Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите раздуплиться (SQL 2005)  [new]
VerhoLom
Member

Откуда:
Сообщений: 4
Че-то туплю без меры. Вкратце, схема такая:

1. Есть ХП, которая выполняет на линк-сервере SQL-запросы (sp_ExecuteAtLinkServer). Проверено, работает

2. Есть ХП, которая выполняет бэкап базы на линк-сервере. Смысл работы в том, что формируется запрос (BACKUP DATABASE) и выполняется вызов sp_ExecuteAtLinkServer для его выполнения на прилинкованном сервере. Проблема в чем: ругается на содержимое одного из параметров - имя папки, куда надо сбэкапить базу. Пишет, что некорректный синтаксис и выставляет первый символ строки с именем папки (Incorrect syntax near '\', если задать UNC путь, или Incorrect syntax near 'd', если задать, к примеру, 'd:\'). Я сперва грешил на отсутствие N перед ней. Но нет - все то же самое. Вот текст ХП:

IF exists(SELECT * FROM sysobjects WHERE type='P' and name='sp_BackupRemoteDatabase' and sysstat & 0xf = 4)
	DROP PROCEDURE sp_BackupRemoteDatabase
go

CREATE PROCEDURE sp_BackupRemoteDatabase
	@srvName VARCHAR(255),
	@dbName VARCHAR(50),
	@dbFolder VARCHAR(255),
	@dbFile VARCHAR(255) OUTPUT
AS
BEGIN
	DECLARE @dwRet INT
	
	--OK
	DECLARE @curDate DATETIME
	SET @curDate=GETDATE()
	
	--формируем имя конечного файла (добавим "\" если надо и т. д.)
	DECLARE @fileName VARCHAR(255)
	SET @filename=@dbFolder
	IF RIGHT(@filename,1)!='\'
		SET @fileName=@fileName+'\'
	print @filename --на всякий случай для отладки

	--ну и для уникальности имени файла вставим дату вплоть до милисекунд
	SET @fileName=	@fileName + @dbName + '_' +
					CAST(DATEPART(dd,@curdate) AS VARCHAR(2)) + 
					CAST(DATEPART(mm,@curdate) AS VARCHAR(2)) + 
					CAST(DATEPART(yyyy,@curdate) AS VARCHAR(4)) + 
					CAST(DATEPART(hh,@curdate) AS VARCHAR(2)) + 
					CAST(DATEPART(mi,@curdate) AS VARCHAR(2)) + 
					CAST(DATEPART(ss,@curdate) AS VARCHAR(2)) + 
					'.bkf'
	print @filename

	--сам запрос
	DECLARE @sql VARCHAR(255)
	SET @sql=	'BACKUP DATABASE [' +
				@dbName + 
				'] TO  DISK = ''' + 
				@fileName + 
				''' WITH NOFORMAT, INIT,  NAME = ''' + 
				@dbName + 
				'_regular_backup'', SKIP, NOREWIND, NOUNLOAD,  STATS = 10'
	print @sql

	--Выполняем (причем закоментированный запрос выполняется без проблем)
	EXEC @dwRet=dbo.sp_ExecuteAtLinkServer @srvName, 1, @sql --'select * from sysobjects'
						--1- это код операции, которую я щас делаю (свой, для занесения в лог в случае ошибки)
	IF @dwRet=0
		RETURN 0
	
	--вернем наружу имя файла, в который сбэкапили базу
	SET @dbFile=@fileName
	RETURN 1
END
GO


Вот ее вызов:

USE [backup]
GO

DECLARE	@return_value int,
		@dbFile varchar(255)

SELECT	@dbFile = N'ww' --нехай будет

EXEC	@return_value = [dbo].[sp_BackupRemoteDatabase]
		@srvName = N'sqlserver',
		@dbName = N'mydata',
		@dbFolder = N'd:\',
		@dbFile = @dbFile OUTPUT

SELECT	@dbFile as N'@dbFile'

SELECT	'Return Value' = @return_value, 'Error text' = msg from [log] where id=@@identity

GO


В таблицу log запись заносит сама sp_ExecuteAtLinkServer, если произошла ошибка при выполнении запроса. Сам запрос выходит правильный (print @sql, в коде). Вот пример вывода:

BACKUP DATABASE [mydata] TO DISK = 'd:\mydata_30122011132527.bkf' WITH NOFORMAT, INIT, NAME = 'mydata_regular_backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10

Что интересно, если соединиться в Менеджмент студии с сервером напрямую и выполнить на нем этот запрос, все прекрасно работает.

А если выполнить его же так:

exec('BACKUP DATABASE [mydata] TO DISK = ''d:\mydata_30122011132527.bkf'' WITH NOFORMAT, INIT, NAME = ''mydata_regular_backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 10') at sqlserver

то тоже он нормально отрабатывает. В чем тогда бок? Может я чего не замечаю? :-(
30 дек 11, 15:05    [11850821]     Ответить | Цитировать Сообщить модератору
 Re: Помогите раздуплиться (SQL 2005)  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
Чудес на свете не бывает. Если выполняется через exec(), но не выполняется через вашу sp_ExecuteAtLinkServer, то проблемы именно в вашей процедуре. Ищите где там в ней корежится строка.
Кстати, настоятельно не рекомендуется именовать пользовательские процедуры начиная с "sp_" и функции с "fn_".
30 дек 11, 15:37    [11850956]     Ответить | Цитировать Сообщить модератору
 Re: Помогите раздуплиться (SQL 2005)  [new]
VerhoLom
Member

Откуда:
Сообщений: 4
Эт точно. Кавычки продублировал еще раз и все заработало.
12 янв 12, 19:50    [11895275]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить