2014-01-13 3 views
1

Я создаю «динамические» SQL-заявления из Powershell и передаю их на сервер PostGreSQL в Windows.Вставка сбой в psql.exe (создана из powershell)

Ниже приведен код

for ($i=1; $i -le 9; $i++) 
{ 
$CurDate = (get-date -format "yyyy-MM-dd HH:mm:ss") 
$BatchLogInsert = "Insert into `"TEMP`".`"batchLog`" (batchid, filename, status, createdate) values ('" + $NewBatchID + "','File"+$i+"','Init','"+$CurDate+"');" 
write-host $BatchLogInsert 

C:\PostgreSQL\9.3\bin\psql.exe -h $DBSERVER -U $DBUSER -d $CLIENTPREFIX -w -c $BatchLogInsert 
} 

записи хоста возвращается:

Insert into "TEMP"."batchLog" (batchid, filename, status, createdate) values ('3','File1','Init','2014-01-13 16:24:49'); 
Insert into "TEMP"."batchLog" (batchid, filename, status, createdate) values ('3','File2','Init','2014-01-13 16:24:49'); 
Insert into "TEMP"."batchLog" (batchid, filename, status, createdate) values ('3','File3','Init','2014-01-13 16:24:49'); 

и так далее.

Когда я выполняю эти вставки в окне «Запрос» PGAdmin, он работает. Однако, когда я вызываю psql.exe, он не отвечает

ERROR: Relation "TEMP.batchLog" does not exist 
LINE 1: Insert into TEMP.batchLog (batchid, filename, status, created... 

Что я здесь делаю неправильно?


EDIT: Вот скриншот моего окна Powershell и окна PgAdmin ... Screenshot


+0

Либо вы не выполняете одни и те же запросы в 'psql' и pgAdmin, или (более вероятно), что вы не подключаетесь к одной базе данных. –

+0

'' TEMP.batchLog '' отличается от '' TEMP "." BatchLog "' (возможно, ваш pgadmin submit не включал никаких кавычек вообще) – wildplasser

+0

@ MilenA.Radev Я знаю, что это кажется неправильным, но, не знаю, что будет быть хорошим способом показать, что я пытаюсь подключиться к правильной БД. Его первый раз с PostGreSql, и у меня возникают проблемы с тем, что, похоже, правильно работает с простой вставкой. – DataRiver

ответ

2

Ваш Doub le quotes едят Powershell, Postgres видит имя без кавычек, сводит его к нижнему регистру и не находит такую ​​таблицу.

Собственные двойные кавычек миновать, кажется, связаны с обратными косыми чертами и кавычку:

$BatchLogInsert = "Insert into \`"TEMP\`".\`"batchLog\`" (... 

Было бы проще, чтобы избежать использования другого случая в именах объектов БД в целом.

+0

Это сделало трюк. '' Вставить в \ "+ схему $ + ". \" batchLog \ "(batchid, filename, st' ... – DataRiver

0

Каждый раз, когда вы делаете "струна здание," Я рекомендую людям использовать .NET форматирование строк в PowerShell. Кроме того, использование командлета Start-Process может значительно упростить передачу аргументов в исполняемые файлы.

$PSql = 'C:\PostgreSQL\9.3\bin\psql.exe'; 

for ($i=1; $i -le 9; $i++) 
{ 
    $CurDate = (Get-Date -Format 'yyyy-MM-dd HH:mm:ss'); 
    $BatchLogInsert = 'Insert into "TEMP"."batchLog" (batchid, filename, status, createdate) values (''{0}'', ''File{1}'', ''Init'', ''{2}'');' -f $NewBatchID, $i, $CurDate; 
    Write-Host -Object $BatchLogInsert; 

    $ArgumentList = '-h {0} -U {1} -d {2} -w -c "{3}"' -f $DBServer, $DBUser, $ClientPrefix, $BatchLogInsert; 
    Start-Process -FilePath $PSql -ArgumentList $ArgumentList -Wait -NoNewWindow; 
} 
+1

Я не думаю, что это сработает, потому что каждый объект (таблица, представление, colone ... и т. Д.), Имя которого содержит верхний регистр, должно быть написано. Вы должны изменить генерацию инструкции вставки. – Houari

+0

@TrevorSullivan: Спасибо. Но, я все еще получал ту же ошибку. «Вставить в« TEMP ».« BatchLog »(batchid, filename, status, createdate) значения ('4', 'File1', 'Init', '2014-01-14 08:47:26' ); ОШИБКА: отношение «temp.batchlog» не существует LINE 1: Вставить в TEMP.batchLog (batchid, filename, status, created ... ' – DataRiver

+0

@Houari Можете ли вы поделиться примером? Наша компания недавно (и внезапно) решил переключиться на PostGreSQL с SQLServer.Мы пытаемся изучить его, когда мы пытаемся изменить наши предыдущие скрипты, которые удовлетворяли SQLServer. – DataRiver

0

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

$BatchLogInsert = 'Insert into "TEMP"."batchLog" (batchid, filename, status, createdate) values (''{0}'', ''File{1}'', ''Init'', ''{2}'');' -f $NewBatchID, $i, $CurDate; 

С

$BatchLogInsert = 'Insert into ""TEMP"".""batchLog"" (batchid, filename, status, createdate) values (''' + $NewBatchID + ''',''File'+$i.ToSTring()+''',''Init'','''+$CurDate+''');'; 

на основе: [ответ]: https://stackoverflow.com/a/11192247/1216680

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