Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在psql.exe(从powershell创建)中插入失败_Sql_Postgresql_Powershell - Fatal编程技术网

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

在psql.exe(从powershell创建)中插入失败,sql,postgresql,powershell,Sql,Postgresql,Powershell,我正在从Powershell创建“动态”sql语句,并将其传递到Windows上的PostGreSQL server 下面是代码 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 ('"

我正在从Powershell创建“动态”sql语句,并将其传递到Windows上的PostGreSQL server

下面是代码

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...
我做错了什么


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


每当您在进行“字符串构建”时,我建议人们在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;
}

您可以像这样转义嵌套的双引号,或者最好使用单引号对字符串进行转义,这样就不需要转义双引号。请尝试替换:

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


基于:[Response]:

您的双引号被Powershell吃掉,Postgres看到一个没有引号的表名,将其折叠为小写,但找不到这样的表

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

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

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

或者您没有在
psql
和pgAdmin中执行相同的查询,或者(更可能)您没有连接到相同的数据库。
“TEMP.batchLog”
“TEMP.”“batchLog”
(您的pgadmin提交可能根本不包含任何报价)@MilenA.Radev我知道这似乎是错误的,但是,不知道用什么好的方式来表明我正在尝试连接到正确的数据库。这是我第一次使用PostGreSql,我在获得一个简单的插入工作时遇到了问题correctly@wildplasser如上所述,我相信我已经运行了Powershell(写主机)的输出对PgAdmin来说,它工作正常。然而,这让我无法理解是什么让这样一件琐碎的事情得以完成。用反斜杠和反斜杠逃避双引号是有效的。我认为这不会奏效,因为每个对象(表、视图、冒号…等等)包含大写字母的名称必须写为引号。您必须修改insert指令的生成。@TrevorSullivan:谢谢。但是,我还是得到了相同的错误。
insert到“TEMP”中。“batchLog”(batchid,filename,status,createdate)值('4','File1','Init','2014-01-14 08:47:26');错误:关系“TEMP.batchLog”“不存在第1行:插入TEMP.batchLog(batchid、文件名、状态、已创建…
@Houari您能分享一个例子吗?我们公司最近(突然)发布了一个)已决定从SQLServer切换到PostGreSQL。我们正在尝试学习它,同时尝试修改以前针对SQLServer的脚本。这成功了。谢谢。
'Insert into\“+$Schema+”\“\”batchLog\”(batchid,filename,st
。。。
$BatchLogInsert = "Insert into \`"TEMP\`".\`"batchLog\`" (...