仅在一张表中插入引发“在SET子句中指定列名不止一次”的表

时间:2018-07-09 19:27:17

标签: sql-server node.js insert

我正在使用node + mssql批量插入数据。我有一个测试表,可以从同一台服务器的生产表中克隆出来。在测试表上,一切正常,插入顺利进行。

将目标更改为生产表时,我得到:The column name 'CallStartTime' is specified more than once in the SET clause or column list of an INSERT. A column cannot be assigned more than one value in the same clause.我已经记录了我要插入的所有列,并且所有数据的代码和数据都完全相同。这使我相信表之间存在配置差异。任一表上都没有触发器,这又可能是什么引起的?

我可以提供代码段,但不确定是否可以帮助我确定我的代码不是问题。

insert语句在mssql内部形成,这是我传递的参数:

    table.columns.add('From', mssql.VarChar(50), {nullable: true, primary: false});
    table.columns.add('To', mssql.VarChar(50), {nullable: false, primary: true});
    table.columns.add('CallStartTime', mssql.DateTime, {nullable: false, primary:true});
    table.columns.add('CallDirection', mssql.VarChar(5), {nullable: true, primary: false});
    table.columns.add('User', mssql.VarChar(150), {nullable: true, primary: false});
    table.columns.add('QueueName', mssql.VarChar(50), {nullable: true, primary: false});
    table.columns.add('DialedNumber', mssql.VarChar(20), {nullable: true, primary: false});
    table.columns.add('CallDuration', mssql.Time, {nullable: true, primary: false});
    table.columns.add('CallResult', mssql.VarChar(50), {nullable: true, primary: false});

...

            table.rows.add(
                callLogs[i].from,
                callLogs[i].to,
                callLogs[i].startTime,
                callLogs[i].direction,
                callLogs[i].User, 
                callLogs[i].QueueName, 
                callLogs[i].dialedNumber, 
                callLogs[i].duration, 
                callLogs[i].result
            );

1 个答案:

答案 0 :(得分:0)

以防万一其他人遇到此问题。我设法解决了。在table.js中构建表时,mssql / msnodesqlv8 lib在提供的连接上运行查询以提取表参数。它使用这些参数来构建语句。这是运行以获取这些参数的查询:

WITH t_fuzzy_cte(id, full_name, table_name) AS

(SELECT  TOP (1)
        0 AS id,
        TABLE_CATALOG + '..' + TABLE_NAME AS full_name,
        TABLE_NAME
        FROM
                your_DB_name.INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME LIKE 'your_table_name%')
,
t_exact_cte(id, full_name, table_name) AS
(SELECT TOP (1)
                0 AS id,
                TABLE_CATALOG + '..' + TABLE_NAME AS full_name,
                TABLE_NAME
      FROM
                        your_DB_name.INFORMATION_SCHEMA.COLUMNS
      WHERE TABLE_NAME = 'your_table_name'
),
t_name_cte(full_name, table_name) AS
(
        SELECT
            ISNULL(e.full_name, f.full_name) AS full_name,
            ISNULL(e.table_name, f.table_name) AS table_name
    FROM t_fuzzy_cte AS f
                LEFT OUTER JOIN t_exact_cte AS e ON e.id = f.id
)
SELECT
        sc.table_catalog,
        sc.table_schema,
        sc.table_name,
  c.name name,
  t.Name type,
  c.max_length,
  c.precision,
  c.scale,
  c.is_nullable,
  c.is_computed,
  c.is_identity,
  c.object_id,
  (
  CASE
  WHEN CONSTRAINT_NAME IN (SELECT NAME
                           FROM FN_STAGE_TEST.sys.objects
                           WHERE TYPE = 'PK')
    THEN 1
  ELSE 0
  END) AS is_primary_key,
  (CASE
  WHEN CONSTRAINT_NAME IN (SELECT NAME
                           FROM your_DB_name.sys.objects
                           WHERE TYPE = 'F')
    THEN 1
  ELSE 0
  END) AS is_foreign_key
FROM your_DB_name.INFORMATION_SCHEMA.TABLES st
  INNER JOIN your_DB_name.INFORMATION_SCHEMA.COLUMNS sc
    ON sc.TABLE_CATALOG = st.TABLE_CATALOG
       AND sc.TABLE_SCHEMA = st.TABLE_SCHEMA
       AND sc.TABLE_NAME = st.TABLE_NAME
  LEFT JOIN your_DB_name.INFORMATION_SCHEMA.KEY_COLUMN_USAGE u
    ON sc.TABLE_CATALOG = u.TABLE_CATALOG
       AND sc.TABLE_SCHEMA = u.TABLE_SCHEMA
       AND sc.TABLE_NAME = u.TABLE_NAME
       AND sc.COLUMN_NAME = u.COLUMN_NAME
  cross join t_name_cte r
  INNER JOIN
  your_DB_name.sys.columns c ON c.name = sc.column_name
  INNER JOIN
  your_DB_name.sys.types t ON c.user_type_id = t.user_type_id
  INNER JOIN
  your_DB_name.sys.tables ta ON ta.name = r.table_name
  LEFT OUTER JOIN
  your_DB_name.sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
  LEFT OUTER JOIN
  your_DB_name.sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
WHERE
  c.object_id = ta.object_id
  AND TABLE_TYPE = 'BASE TABLE'
  AND sc.TABLE_NAME = r.table_name
  AND (sc.TABLE_SCHEMA = '' or '' = '')
  AND (ta.schema_id = SCHEMA_ID('') or '' = '')

生产表上的一个索引(专门索引CallStartTime列)使该查询两次返回该行。要解决此问题,我必须删除索引。