关于SQL调试的问题

cpp_1 2016-11-30 11:43:37
问一下,MS-SQL 在做insert,update的时候

如果遇到字段长度不够,或是类型不对,错误信息有没有可以报到具体是哪一个字段出错

如果一个一个找过来,表结构字段属性太大,这个工作效率太低了

我知道可以在insert 或update之前做检查

只是想问一下,有没有这样更人性化的错误提示。

比如,有30个字段,某一个字段长度50,在做insert的时候,这个太长了,就直接报“截断字符”,能不能提示到某一个字段。

谢谢
...全文
283 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
SELECT LEN()>MM 看一下
卖水果的net 2016-11-30
  • 打赏
  • 举报
回复
没有这样的功能,这个错误是 SQL Server 打出来的,用户也不能自定义这个; 不知道 @中国风 有没有这方面的经验;
中国风 2016-11-30
  • 打赏
  • 举报
回复
每次操作数据都去检查就为了获取出错列,牺牲了性能,没必要去做这类动作 可作为工具,有问题时调用检查 SQL_VARIANT_PROPERTY--查看联机这函数用法比如,小数有效位之类,可判断类型是否兼容
中国风 2016-11-30
  • 打赏
  • 举报
回复
不能,只能自定义个去验证类型,操作数据前去调用验证

用这样的的真没必要去做这类判断,通过错误,调用一个方法(自己动手去写),直接检查
细节自己去判断,如int兼容smallint/tinyint之类
简单举个例子

e.g.
USE tempdb
GO
CREATE TABLE DataType(ID INT,Name VARCHAR(50));
GO
DECLARE @ID INT=10,@Name VARCHAR(100)=REPLICATE('A',100),@ErrorMsg NVARCHAR(200)
;WITH CTECol(ColType,Lenth ,ColName)
AS
(
SELECT CAST(SQL_VARIANT_PROPERTY(@ID,'BaseType')AS sysname),CAST(SQL_VARIANT_PROPERTY(@ID,'MaxLength') AS INT),CAST('ID' AS sysname)
UNION ALL
SELECT CAST(SQL_VARIANT_PROPERTY(@Name,'BaseType') AS sysname),CAST(SQL_VARIANT_PROPERTY(@Name,'MaxLength') AS INT),'Name'
)
SELECT @ErrorMsg=STUFF(Col,1,1,'')
FROM (
SELECT ','+CASE WHEN d.ColType<>c.name THEN d.ColType+'|'+c.name+'类型不一致' ELSE '' END+CASE WHEN d.Lenth>b.max_length THEN RTRIM(d.Lenth)+'|'+RTRIM(b.max_length)+'长度不兼容' ELSE '' END
FROM sys.tables AS a
INNER JOIN sys.columns AS b ON b.object_id = a.object_id
INNER JOIN sys.types AS c ON c.user_type_id = b.user_type_id
INNER JOIN CTECol AS d ON d.ColName=b.name AND (d.ColType<>c.name OR d.Lenth>b.max_length)
WHERE a.name='DataType'
FOR XML PATH(''))t(Col)

IF @ErrorMsg>''
RAISERROR(@ErrorMsg,16,1)

/*
消息 50000,级别 16,状态 1,第 23 行
100|50长度不兼容

*/
Tiger_Zhao 2016-11-30
  • 打赏
  • 举报
回复
数据的有效性应该是前台程序更新数据之前进行检查的。
如果要做通用方法,你可以用下面的语句取得字段定义,然后根据不同的类型进行对应的数据检查。
    SELECT t.name As table_name,
c.column_id,
c.name AS column_name,
p.name As type_name,
c.max_length,
c.precision,
c.scale
FROM sys.tables t
JOIN sys.columns c
ON t.object_id = c.object_id
JOIN sys.types p
ON c.system_type_id = p.system_type_id
WHERE type='U'
AND t.name = 'table1'
ORDER BY table_name, column_id

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧