2012-05-31 3 views
3

Im пытается прочитать в sql-файле, который будет выполнен с помощью powershell. Все работает отлично, за исключением того, что powershell выдает ошибку из-за разделителя слов. Итак, мой вопрос: как я могу использовать разделитель в моем sql-файле (я могу внести незначительные изменения в файл sql, его код должен оставаться относительно неизменным), но загружая его правильно через powershell.Как использовать разделитель SQL через powershell

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

Powershell:

$sql = (Get-Content $pwd\NewClient.sql) | Out-String 
$cmd.CommandText = "USE $dbname" 
$cmd.ExecuteNonQuery() 
$cmd.CommandText = $sql 
$cmd.ExecuteNonQuery() 

SQL:

delimiter // 
...... 
end;// 
delimiter ; 

Исключение вызова "ExecuteNonQuery" с "0" аргумент (ы): «У вас есть ошибка в вашем синтаксисе SQL; в руководстве, соответствует вашей версии сервера MySQL для правильного синтаксиса для использования рядом с «Разделителем // создать триггер stop_time_insert после вставки на стопах по строке 1»

+0

Вы можете отправить код SQL? Кроме того, я не думаю, что оператор use будет иметь какое-то влияние на второй вызов ExecuteNonQuery. –

+0

Извините за незнание, но как я могу отправить вам код? Я сделал быстрый поиск и обнаружил, что SO не имеет опции PM. Должен ли я просто вставить код здесь? – G3TH

+0

Извините, я неправильно понял вопрос в первый раз. Я бы предположил, что проблема связана с терминатором линии между двумя системами. Я предполагаю, что mysql набирает «delimiter // create trigger ...». на одной строке, вызывая синтаксическую ошибку. Я не знаю, как это исправить. –

ответ

1

Powe rshell не поддерживает ключевое слово Delimiter, но на самом деле это не обязательно.

Вашего

create trigger stop_time_insert after insert on stops 
begin 
    //do stuff 
end; 

блок будет работать без разделителей, так как Powershell обрабатывает всю команду в качестве отдельного пункта, вместо того, как интерфейс командной строки MySQL рассматривает его как набор многострочного.

Так что просто удалите инструкции Delimiter, и все должно быть в порядке. (Протестировано на локальную машину здесь.)

+0

Большое спасибо. Это решение сработало. – G3TH

4

Я понимаю, что это очень старая тема, но я думаю, что это единственная тема, посвященная этой теме. Ответное решение работает, но вы не можете использовать тот же скрипт при запуске из командной строки MySQL. Я создал функцию PS следующим образом:

function executeScript([MySql.Data.MySqlClient.MySqlConnection]$conn, [String]$filePath) 
{ 
    $fileName = Split-Path $filePath -Leaf 
    Write-Host "Executing $fileName script" 
    $sqlText = Get-Content $filePath | Out-String 
    $sqlText = $sqlText.Replace("DELIMITER","-- DELIMITER") 
    $sqlText = $sqlText.Replace('$$',";") 
    return Invoke-MySql -sql $sqlText -connection $conn | Out-Null 
} 

Предположим, SQL скрипт следующим образом:

DELIMITER $$ 
.... 
END $$ 
DELIMITER ; 

Invoke-MySql от пакета MySQLLib Майка Шепарда.

Теперь тот же файл сценария может быть выполнен из обеих сред.

+0

Спасибо за более общее (хотя и немного хакерское) решение! – ysalmi