2013-09-05 4 views
1

Я использую следующее в качестве экспортного запроса, и мне пришлось перейти на новый обновленный сервер Windows 2003-2008R2. Я также обновил с SQL 2005 до SQL 2012 и, по-видимому, получил некоторые разрешения. Следующий код должен записывать в файл, который подбирается dbmail и отправляется по электронной почте. Проблема в том, что он не пишет файл, и я считаю, что разрешения являются проблемой, но я не уверен, где я ошибся. Я знал, что это работает, поскольку он работал годами на другом сервере без заминки, поэтому проблема должна быть разрешениями, которые я угадываю.Команда BCP не записывает файл

Сообщение, которое я получаю следующим образом и происходит потому, что файл не создается:

Исполнено как пользователь: NT SERVICE \ SQLSERVERAGENT. Файл прикрепления D: \ Argosy_import_090513_0001.txt недействителен. [SQLSTATE 42000] (Ошибка 22051). Не удалось выполнить этот шаг.

Declare @PeriodStart Datetime 
Declare @PeriodEnd Datetime 
SELECT @PeriodEnd = GetDate() 
,@PeriodStart = dateadd(hour,-72,getdate()) 

;WITH outpQ 
AS 
(
SELECT 1 AS grpOrd, CAST(null AS VARCHAR(255)) AS posInGrp, 'A' AS Ord, CaseNumberKey, 'A|' + ClientsKey + '|' + CAST(BRTNumber AS VARCHAR(11)) + '|' + IsNull(replace(convert(char(10), CoverDate, 101), '/', ''), '') + '|' + IsNull(replace(convert(char(10), CoverDate, 101), '/', ''), '') + '|' + IsNull(ParcelNumber, '') + '|' + IsNull(AssessedBeg, '') + '|' + IsNull(AssessedDim, '') + '|' + IsNull(AbbrLegal, '') + '|' + IsNull(WaterFrom, '') + '|' + IsNull(WaterTo, '') + '|' + IsNull(Cast(WaterOpen AS VARCHAR(50)), '') + '|' + IsNull(TaxFrom, '') + '|' + IsNull(TaxTo, '') + '|' + IsNull(Cast(TaxOpen AS VARCHAR(50)), '') AS Extract 
FROM newCityCollection.dbo.PropertyInformation 
WHERE DateFinished BETWEEN @PeriodStart AND @PeriodEnd AND ClientKey = 2 
UNION ALL 
SELECT 1 As grpOrd, null AS posInGrp, 'A1', A.CaseNumberKey, 'A1|' + '|' + '|' + B.LienNumber + '|' + IsNull(Cast(B.LienAmt AS VARCHAR(50)), '') + '|' + IsNull(replace(LienDate, '/', ''), '') + '|' + IsNull(B.LienReason, '') AS Extract 
FROM newCityCollection.dbo.PropertyInformation A 
JOIN newCityCollection.dbo.muniLiens B ON B.CaseNumberKey = A.CaseNumberKey 
WHERE A.DateFinished BETWEEN @PeriodStart AND @PeriodEnd AND ClientKey = 2 
UNION ALL 
SELECT 2 AS grpOrd, CAST(C.InterestsKey AS VARCHAR(11)) AS posInGrp, 'B', A.CaseNumberKey, 'B|' + '|' + IsNull(C.First, '') + '|' + IsNull(C.Middle, '') + '|' + IsNull(C.Last, '') + '|' + IsNull(C.Alias, '') + '|' + IsNull(C.ComName, '') + '|' + IsNull(C.DocRel, '') + '|' + Cast(C.InterestsKey AS VARCHAR(11)) AS Extract 
FROM newCityCollection.dbo.PropertyInformation A 
JOIN newCityCollection.dbo.Interests C ON C.CaseNumberKey = A.CaseNumberKey 
WHERE A.DateFinished BETWEEN @PeriodStart AND @PeriodEnd AND ClientKey = 2 
UNION ALL 
SELECT 2 AS grpOrd, CAST(C.InterestsKey AS VARCHAR(11)) AS posInGrp, 'B1', A.CaseNumberKey, 'B1|' + IsNull(FullAdd, '') + '|' + IsNull(D.City, '') + '|' + IsNull(D.State, '') + '|' + IsNull(D.Zip, '') AS Extract 
FROM newCityCollection.dbo.PropertyInformation A 
JOIN newCityCollection.dbo.Interests C ON C.CaseNumberKey = A.CaseNumberKey 
JOIN newCityCollection.dbo.InterestAdd D ON D.CaseNumberKey = A.CaseNumberKey AND D.InterestsKey = C.InterestsKey 
WHERE A.DateFinished BETWEEN @PeriodStart AND @PeriodEnd AND ClientKey = 2 
UNION ALL 
SELECT 2 AS grpOrd, CAST(C.InterestsKey AS VARCHAR(11)) AS posInGrp, 'B2', A.CaseNumberKey, 'B2|' + '|' + IsNull(E.SuitNumber, '') + '|' + Cast(E.BDate AS VARCHAR(11)) + '|' + IsNull(E.Chapter, '') + '|' + IsNull(E.VS, '') AS Extract 
FROM newCityCollection.dbo.PropertyInformation A 
JOIN newCityCollection.dbo.Interests C ON C.CaseNumberKey = A.CaseNumberKey 
JOIN newCityCollection.dbo.Banks E ON E.CaseNumberKey = A.CaseNumberKey AND E.InterestsKey = C.InterestsKey 
WHERE A.DateFinished BETWEEN @PeriodStart AND @PeriodEnd AND ClientKey = 2 
UNION ALL 
SELECT 3 As grpOrd3, null AS posInGrp, 'B3', A.CaseNumberKey, 'B3|' + '|' + F.DocType + '|' + IsNull(Cast(F.DocAmt AS VARCHAR(50)), '') + '|' + IsNull(replace(convert(char(10), DocDate, 101), '/', ''), '') + '|' + IsNull(replace(convert(char(10), RecDate, 101), '/', ''), '') + '|' + IsNull(F.DocID, '') + '|' + IsNull(F.Grantee,'') + '|' + IsNull(F.Grantor,'') + Cast(F.DocIDKey AS VARCHAR(11)) AS Extract 
FROM newCityCollection.dbo.PropertyInformation A                                                                                
JOIN newCityCollection.dbo.Documents F ON F.CaseNumberKey = A.CaseNumberKey 
WHERE A.DateFinished BETWEEN @PeriodStart AND @PeriodEnd AND ClientKey = 2           
UNION ALL 
SELECT 4 AS grpOrd, null AS posInGrp, 'C', A.CaseNumberKey, 'C|' + IsNull(J.CType, '') + '|' + IsNull(J.plaintiffName,'') + '|' + IsNull(J.plaintiffAdd1, '') + '|' + IsNull(J.plaintiffCity, '') + '|' + IsNull(J.plaintiffState, '') + '|' + IsNull(J.plaintiffZip, '') + '|' + '|' + IsNull(J.defendantName, '') + '|' + IsNull(J.defendantAdd1, '') + '|' + IsNull(J.defCity, '') + '|' + IsNull(J.defState, '') + '|' + IsNull(J.defZip, '') + '|' + '|' + IsNull(J.Court, '') + '|' + IsNull(J.CaseID, '') + '|' + IsNull(J.JAmt, '') + '|' + IsNull(replace(convert(VarChar(10), JDate, 101), '/', ''), '') + '|' + IsNull(replace(convert(VARCHAR(10), revivedDate, 101), '/', ''), '') AS Extract 
FROM newCityCollection.dbo.PropertyInformation A 
JOIN Acme.new_judgment_system.dbo.selected_compiled_clean J ON J.CaseNumber = A.CaseNumberKey 
WHERE A.DateFinished BETWEEN @PeriodStart AND @PeriodEnd AND ClientKey = 2 AND J.plaintiffName NOT IN (SELECT Plaintiff FROM newCityCollection.dbo.excluded_Plaintiffs) 
) 

--Extract data set into a table -- dump table in .txt with current date as part of name then delete that table 

SELECT Extract INTO datadump FROM outpQ ORDER BY CaseNumberKey, grpOrd, posInGrp, Ord 
DECLARE @FileName varchar(50), 
     @bcpCommand varchar(2000) 

SET @FileName = REPLACE('D:\Argosy_import_'+CONVERT(char(8),GETDATE(),1)+'_0001.txt','/','') 

SET @bcpCommand = 'bcp "SELECT Extract FROM datadump" QUERYOUT "' 
SET @bcpCommand = @bcpCommand + @FileName + '" -U sa -P ********** -T -c' 

EXEC master..xp_cmdshell @bcpCommand 

DROP table datadump 

EXEC msdb.dbo.sp_send_dbmail 
@recipients=N'[email protected]', 
@body='Message Body', 
@subject ='Import file from My Company', 
@profile_name ='Mail', 
@file_attachments = @FileName; 

ответ

1

Был ли изменен размер вложения на значение по умолчанию?

Посмотрите, существует ли приложение на сервере!

В приведенном ниже коде показан текущий размер вложения, а затем устанавливается максимальный размер для DBMail.

-- show current size 
exec msdb.dbo.sysmail_help_configure_sp 'MaxFileSize' 

-- set the max attachment size to 20000 bytes 
exec msdb.dbo.sysmail_configure_sp 'MaxFileSize', '20000'; 

Кроме того, убедитесь, что расширение приложения разрешено по почте.

-- show prohibited extensions 
EXEC msdb.dbo.sysmail_help_configure_sp 'ProhibitedExtensions' 
+0

Вложение не создается. – korrowan

+0

Убедитесь, что учетная запись службы SQL Server имеет доступ к созданию файлов в этом каталоге. Для теста создайте каталог c: \ test для всех. Измените местоположение. Если он работает, то это вопрос с разрешением. –

+0

Я спустил отверстие для расширения размера и расширения, так как увидел ответ в блоге с сообщением об ошибке. –

0

Наблюдаемые странное поведение с помощью команды BCP:

я. Если команда BCP выполняется из командной оболочки, то сгенерированный файл находится на локальной машине

ii. Если команда BCP выполняется в SQL Server Management Studio, файл создается на имя сервера, указанное в команде.

Следовательно, убедитесь, что вы предоставили правильное имя сервера (параметр -S) в команде BCP.

+0

ничего странного: bcp - это программа командной строки. Он подключается к sql (удаленному или локальному) и сохраняет файл (локальный). Когда вы вызываете bcp из студии управления, вы отправляете (удаленный) comand в sql для выполнения (на sql-компьютере) «локальной» программы bcp.exe. Вот почему он выполняется на компьютере, где работает sql. – parfilko

+0

Да, это так. Это так. Спасибо за объяснение. – ShivanandSK