2015-09-03 4 views
0

Im пытается запустить процедуру магазин запрос на экспорт в CSV-файл с помощью BCP в качестве ежедневной задачи на SQL сервереBCP SQL экспорт в CSV

используя обычный запрос в порядке, например

выберите работы @ CSV = 'BCP "выберите * из таблицы" queryout '+ @ FileAndPath2 +' -c -t, -T -S' + @@ имясервера

Однако, когда я добавляю мой запрос, который представляет собой список данных сделок в диапазон дат, похоже, сбой

@p_companyId uniqueidentifier = '189be460-99d1-42e9-b4ed-8de6f8724ce8', 
@p_Path   varchar(300) = 'C:\temp\',' 
@p_Date datetime = getutcdate 

set @[email protected]_Path + CONVERT(nvarchar(30), @p_Date, 112) + '_' + CONVERT(varchar(36), @p_companyId) + '_transactionslog.csv'; 

    declare @csv varchar(8000) 
    declare @csvSQL varchar(8000) 
    set @csvSQL = 'SELECT TOP (100) [KICSDEV].dbo.MOVIEDETAIL.Title , [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.MemberId, [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.CreateDateTime as ''DateTime'' FROM [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG INNER JOIN [KICSDEV].dbo.MOVIEDETAIL ON [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.MovieDetailId = [KICSDEV].dbo.MOVIEDETAIL.MovieDetailId INNER JOIN [KICSDEV].dbo.MEMBER ON [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.MemberId = [KICSDEV].dbo.MEMBER.MemberId INNER JOIN [KICSDEV].dbo.CINEMA ON [KICSDEV].dbo.MEMBER.CinemaId = [KICSDEV].dbo.CINEMA.CinemaId WHERE ([KICSDEV].dbo.CINEMA.CompanyId = '+ @p_companyId + ' and [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.CreateDateTime >= ' + @p_Date +' and [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.CreateDateTime < DATEADD (day , 1 , '[email protected]_Date+'))' 
    select @csvSQL 
select @csv = 'bcp "'+ @csvSQL +'" queryout '[email protected]+' -c -t, -T -S' [email protected]@servername 
    exec master..xp_cmdshell @csv 

Когда я запускаю его, это выглядит как «Типы данных varchar и uniqueidentifier несовместимы в операторе добавления». ошибка

Когда я меняю компанию на строку вместо переменной в запросе, она отлично работает, но ошибки на ней.

set @csvSQL = 'SELECT TOP (100) [KICSDEV].dbo.MOVIEDETAIL.Title , [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.MemberId, [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.CreateDateTime as ''DateTime'' FROM [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG INNER JOIN [KICSDEV].dbo.MOVIEDETAIL ON [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.MovieDetailId = [KICSDEV].dbo.MOVIEDETAIL.MovieDetailId INNER JOIN [KICSDEV].dbo.MEMBER ON [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.MemberId = [KICSDEV].dbo.MEMBER.MemberId INNER JOIN [KICSDEV].dbo.CINEMA ON [KICSDEV].dbo.MEMBER.CinemaId = [KICSDEV].dbo.CINEMA.CinemaId WHERE ([KICSDEV].dbo.CINEMA.CompanyId = ''189be460-99d1-42e9-b4ed-8de6f8724ce8'' and [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.CreateDateTime >= ' + @p_Date +' and [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.CreateDateTime < DATEADD (day , 1 , '[email protected]_Date+'))' 

Конверсия не удалась при преобразовании даты и/или времени из символьной строки.

Я думаю, что это как-то связано со всеми разделителями и типами данных.

ответ

1

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

Шаг 1: Убедитесь, что все это строка перед конкатенации в запросе

Вы отсутствуют некоторые слепки Cast(@p_companyId as VarChar(36)) и CAST(@p_Date as VarChar(25)) вы также должны привести к броску ид компании и даты в отформатированную строку. Я рекомендую сделать новую переменную, чтобы иметь дату UTC как строку @p_DateAsStr varchar(25) = CAST(@p_Date as VarChar(25)), вместо повторения этого снова и снова.

Шаг 2: строковые значения в запросе должны быть указаны

Поскольку вы звоните BCP вы должны форматировать запрос в виде строки, строковые параметры должны быть указаны. Вы должны использовать одиночные кавычки, потому что строка BCP находится в двойных кавычках, например:

set @csvSQL = 'SELECT .... WHERE CompanyId = '''+ Cast(@p_companyId as VarChar(36)) + ''....'

Шаг 3: Преобразовать все строки в запросе в родные типы по мере необходимости встроенных функций

мы в порядке с GUID, указанной в строке (если мы цитируем его), но DataAdd нам нужно преобразовать обратно из строки на сегодняшний день, как это

CreateDateTime < DATEADD (day , 1 , CAST(''' [email protected]_DateAsStr+''' as DateTime))

[Обновить] добавлена ​​строка с кавычками для даты

+0

Привет, Джаспер, Apolgies о нижнем, поскольку я все еще новичок в stackoverflow. Bcp отлично работает на моей локальной машине, но когда я перехожу к моей базе данных, он не работает и возвращается как «Ошибка = [Microsoft] [Собственный клиент SQL Server 10.0] Поставщик имен и имен: не удалось открыть соединение с SQL Server [53]." Я поставил запрос в представлении, так как это привело к превышению ошибки в имени таблицы. UPDATED BCP - выберите @csv = 'bcp" dbo.vw_deltaMembers "out" + @ FileAndPath2 +' -c -t, -T -S '+ @@ servername – KevinC

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