SQL Server CSV экспортируется с использованием агента SQL Server и Powershell? - PullRequest
0 голосов
/ 23 ноября 2011

Я нашел этот ответ, используя xp_cmdshell

Задание агента SQL Server - экспорт результатов в файл с разделителями-табуляциями?

Это будет работать нормально для меня, за исключением того, что мне нужно предоставитьпараметр даты в запросе sql.Параметр даты заполняется с помощью другого SQL-запроса.Думал об использовании powershell.

Есть ли кто-то, кто работал с этим сценарием и готов поделиться сценариями + опытом?

Я мог бы написать консольное приложение на C # ((или класс, который вызывается через Power Shell, как только я выясняю, как это сделать).Только после самого простого, самого свободного свободного пути.

Кстати: мое последнее использование xp_cmdshell было увлечено разрешением разочарований.В прошлый раз мне пришлось учить системного администратора, как это сделать по электронной почте, а также устранять неполадки в настройках блокировки по электронной почте в другом часовом поясе.В результате у меня есть некоторые встроенные колебания ;-).К счастью, у меня есть свобода правления в этой ситуации.

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Можете ли вы попробовать это?:

Если вы хотите использовать его в качестве хранимой процедуры, в которой дата может быть передана вручную или программно:

CREATE PROCEDURE bcp_test_with_date_parameter
    @paramDate DATETIME
AS
BEGIN

    DECLARE @bcpCmd varchar(2000)
    SET @bcpCmd = 'bcp "SELECT * FROM dbname.schema.tablename' 
    SET @bcpCmd = @bcpCmd + 'WHERE CONVERT(VARCHAR, datecolumn, 101) = ''' + CONVERT(VARCHAR, @paramDate, 101) + ''' '
    SET @bcpCmd = @bcpCmd + ' ORDER BY columnnameofchoice" queryout "'
    SET @bcpCmd = @bcpCmd + '"C:\tblNameData.txt" -T -c'

    EXEC master..xp_cmdshell @bcpCmd

END

Но если вы просто хотите захватитьдата из другой таблицы, которую вы могли бы использовать:

DECLARE @bcpCmd varchar(2000)
DECLARE @dateHolder DATETIME
SELECT @dateHolder = CONVERT(VARCHAR, datecolumn, 101) 
    FROM dateparametersourcetable
    WHERE <place conditions here>

SET @bcpCmd = 'bcp "SELECT * FROM dbname.schema.tablename' 
SET @bcpCmd = @bcpCmd + 'WHERE CONVERT(VARCHAR, datecolumn, 101) = ''' + @dateHolder + ''' '
SET @bcpCmd = @bcpCmd + ' ORDER BY columnnameofchoice" queryout "'
SET @bcpCmd = @bcpCmd + '"C:\output.txt" -T -c'

EXEC master..xp_cmdshell @bcpCmd

Право выше также может быть помещено в хранимую процедуру, это действительно зависит от того, как вы хотите это сделать ..

1 голос
/ 23 ноября 2011

Прежде чем беспокоиться о SQL Agent, я бы посоветовал сначала решить проблему создания CSV.Затем вы можете запланировать сценарий Powershell в агенте SQL.Вот некоторый код, который я протестировал для создания файла CSV из запроса SQL с использованием параметра даты из другого запроса:

$orderDate = Invoke-Sqlcmd -ServerInstance "Win7boot\sql1" -Database AdventureWorks -Query "select max(OrderDate) As OrderDate from Sales.SalesOrderHeader" | %{$_.OrderDate} 
Invoke-Sqlcmd -ServerInstance "Win7boot\sql1" -Database AdventureWorks -Query "select * from Sales.SalesOrderHeader where OrderDate < '$orderDate'" | Export-Csv -Path "C:\Users\Public\salesorder.csv" -NoTypeInformation -Force

Это должно работать в агенте SQL точно так же, как в консоли Powershell.Вам нужно будет настроить шаг задания Powershell.

Обратите внимание: если параметр date получается из того же экземпляра сервера, что и основной запрос, вы можете объединить запрос в один:

"select * from Sales.SalesOrderHeader where OrderDate < (select max(OrderDate) from Sales.SalesOrderHeader)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...