在psql.exe中插入失败(从powershell创建)

时间:2014-01-13 21:36:47

标签: sql postgresql powershell

我正在从Powershell创建“动态”sql语句,并将其传递给Windows上的PostGreSQL服务器。

以下是代码

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
}

write-host返回:

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...

我在这里做错了什么?


编辑:这是我的powershell窗口和PgAdmin窗口的屏幕截图... Screenshot


3 个答案:

答案 0 :(得分:2)

你的双引号被Powershell吃掉,Postgres看到一个不带引号的表名,将它折叠成小写并且找不到这样的表。

正确的双引号转义似乎涉及反斜杠反引号:

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

更容易避免在DB对象名称中使用不同的大小写。

答案 1 :(得分:0)

每当你进行“字符串构建”时,我建议人们在PowerShell中使用.NET字符串格式。此外,使用Start-Process cmdlet可以更轻松地将参数传递给可执行文件。

$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;
}

答案 2 :(得分: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