Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.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
Sql 如何在Informix中的MERGE语句中使用源的参数?_Sql_Asp.net_Ado.net_Informix - Fatal编程技术网

Sql 如何在Informix中的MERGE语句中使用源的参数?

Sql 如何在Informix中的MERGE语句中使用源的参数?,sql,asp.net,ado.net,informix,Sql,Asp.net,Ado.net,Informix,我正在尝试对Informix数据库执行一个merge语句,如下所示: MERGE INTO aa_rec AS dest USING (SELECT '123456' AS id, '111-222-3333' as phone, '' as phone_ext, 'CELL' as aa FROM sysmaster:'informix'.sysdual) AS src ON dest.id = src.id AND dest.aa = src.aa WHEN NOT MATCHED THEN

我正在尝试对Informix数据库执行一个merge语句,如下所示:

MERGE INTO aa_rec AS dest
USING (SELECT '123456' AS id, '111-222-3333' as phone, '' as phone_ext, 'CELL' as aa FROM sysmaster:'informix'.sysdual) AS src
ON dest.id = src.id AND dest.aa = src.aa
WHEN NOT MATCHED THEN 
    INSERT (dest.id, dest.aa, dest.beg_date, dest.phone, dest.phone_ext, dest.ofc_add_by)
    VALUES (src.id, src.aa, TODAY, src.phone, src.phone_ext, 'TEST')
WHEN MATCHED THEN UPDATE SET 
        dest.phone = src.phone, 
        dest.phone_ext = src.phone_ext, 
        dest.beg_date = '10/29/2019', 
        dest.ofc_add_by = 'TEST'
此语句使用硬编码值按原样工作,但我希望传递源表中值的参数:

USING (SELECT ? AS id, ? as phone, ? as phone_ext, 'CELL' as aa FROM sysmaster:'informix'.sysdual) AS src
当我使用参数和有效值执行语句时,我收到以下错误:

E42000:(-201)发生语法错误

MERGE语句的源部分是否支持参数?如果是,语法中的错误在哪里

在上下文中,我使用Informix的OleDb提供程序从ASP.NET调用它。

您有:

SELECT ? AS id, ? as phone, ? as phone_ext, 'CELL' as aa FROM sysmaster:'informix'.sysdual
不能对SELECT语句的“结构化”元素使用占位符(
符号)。您不能在占位符中提供列名。通过选择列表中的占位符将数字等作为值传递也不起作用

我可能会创建一个适当形状的临时表,并在其中插入一行,然后在select语句中使用临时表:

SELECT '123456' AS id, '111-222-3333' AS phone, '' AS phone_ext, 'CELL' AS aa
  FROM sysmaster:'informix'.sysdual
  INTO TEMP phone_data;

MERGE INTO aa_rec AS dest
USING (SELECT * FROM phone_data) AS src
   ON dest.id = src.id AND dest.aa = src.aa
 WHEN NOT MATCHED THEN 
      INSERT (dest.id, dest.aa, dest.beg_date, dest.phone, dest.phone_ext, dest.ofc_add_by)
          VALUES (src.id, src.aa, TODAY, src.phone, src.phone_ext, 'TEST')
 WHEN MATCHED THEN UPDATE SET 
          dest.phone = src.phone, 
          dest.phone_ext = src.phone_ext, 
          dest.beg_date = '10/29/2019', 
          dest.ofc_add_by = 'TEST'
;

DROP TABLE phone_data;
显式创建临时表可能比使用INTO temp子句更好/更安全。这些类型不一定是您所期望的(CHAR(6)、CHAR(12)、VARCHAR(1)、CHAR(4))——尽管这可能并不重要

显然,一旦临时表存在,您可以使用任何可用的机制将任何适当的数据插入临时表:

INSERT INTO phone_data(id, phone, phone_ext, aa) VALUES(?, ?, ?, ?)

请记住,临时表是会话的专用表-您可以让许多人同时使用相同的临时表名,而不会相互干扰。

据我所知,他们不接受表和列的主机变量,您需要将查询组装为字符串,然后运行它。