我正在使用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
);
答案 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列)使该查询两次返回该行。要解决此问题,我必须删除索引。