SQL Server - Troubleshoot
文章目录

Violation of PRIMARY KEY constrain

违反了主码约束

出现问题是在 Cockpit Insert 的时候
发现 Insert 的行数的主码有重复
后来发现是之前 JOIN 处理造成了重复
DB-Error: View or function xxx has more column names specified than columns defined.md (6/8/2016 2:38:16 PM)

1
[Macromedia][SQLServer JDBC Driver][SQLServer]view or function 'Reg_Tracker_Standard' has more column names specified than columns defined.

这是一个 view
一般修改了 table 后 view 会自动更改
但是如果出现刚导入或者导出数据的情况, 则会报上面这个错误
解决方法是刷新表 (测试可用) 或者重建 view
反正 view 是根据对应 table 存在的, 因此重建也可以解决问题

The type of column “NAME” conflicts with the type of other columns specified in the UNPIVOT list

1
The type of column "NAME" conflicts with the type of other columns specified in the UNPIVOT list.

说明 Name 这个字段和其他 Unpivot 里面指定的字段类型不同

1
2
3
4
5
6
……
UNPIVOT
(
value FOR items
IN([uid],[name])
) AS unpvt

可能 uid 和 name 类型不同了

String or binary data would be truncated.md (12/30/2015 10:22:13 AM)

1
String or binary data would be truncated.
  • 步骤: 在执行插入语句时, 会提示上面的 error.
  • 原因: 是因为 ** 数据库中定义的字段长度比较小, 在插入或者更新的时候, 用一个比这个字段长度大的值去操作, 就会引起这个错误.**
  • 原因 2:** 定义的列的顺序与插入的列没有对齐 **

Conversion failed when converting datetime from character string.

1
2
3
4
select orgname, suborg, location
from meta_row r
join meta_scope s on r.scopeid = s.scopeid
where datadate = <cfqueryparam cfsqltype="cf_sql_char" value="#form.datadate#">

可以使用 Convert 或者其他办法转换一下

All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

用到了 UNION, INTERSECT or EXCEPT 的部分的行和列数目不相同

string or binary data would be truncated

错误描述: 插入数据的时候出现错误

1
string or binary data would be truncated

主要是因为对应列的字段长度不同

转换一下插入的列即可

1
cast (xxx as nvarchar(500))

Recursive common table expression ‘rows’ does not contain a top-level UNION ALL operator

将多个 CTE 进行最终 UNION 的时候报错

1
2
3
4
5
with a as(
select * from table
), b as(
seledr * from a
)

后来发现在 cte a 中出现了 select * from a
因此出现循环错误

SQL Server-Error: Error Conversion failed when converting the varchar value ‘|’ to data type int.md

Desc

一开始希望直接将 int 和字符串拼接, 后来报这个错误

1
Error Conversion failed when converting the varchar value '|' to data type int

Solution

将 int 转换成 char 再进行处理

1
2
3
4
5
6
7
8
9
10
11
convert(varchar(20),@a) + '|' + convert(varchar(20),@b) as Stickman_Total
```## SQL Server-Error: Conversion failed when converting the nvarchar value 'E123456' to data type int

```sql
SELECT CASE
WHEN isnumeric(customID) = 1
THEN CAST(customID AS INT)
ELSE customID
END AS customid
FROM substanceGroup
WHERE customid = 'E6008130111901'

报错

1
Conversion failed when converting the nvarchar value 'E6008130111901' to data type int.

这里的判断都没问题
问题在于最终选出来的 customID 这一列既包含了 nvarchar 又包含了 int
所以报错
解决方法很简单, 将 case when 的结果统一成相同类型就可以了

Implicit conversion from data type datetime to int is not allowed. Use the CONVERT function to run this query.

[Macromedia][SQLServer JDBC Driver][SQLServer]Implicit conversion from data type datetime to int is not allowed. Use the CONVERT function to run this query.

简单看来是数据转换错误, 一般是因为某个数据类型转换错误

此外当插入表的时候也有可能出现相同错误, 原因是 插入列与表的定义列没有对齐, 可能放置了错误的 Column