【问题标题】:How do I force nvarchar input width in SQL Server?如何在 SQL Server 中强制 nvarchar 输入宽度?
【发布时间】:2012-12-14 16:02:19
【问题描述】:

我有一个为生产线创建的脚本,用户在执行前将一些变量输入到脚本中。问题是变量是 NVARCHAR(9),如果用户输入一个 10 个字符的字符串,最后一个字符被截断(如预期的那样)我想知道的是,如果他们输入一个值,我如何让 SQL 抛出错误太长?这个问题源于用户对输入的过度指法。 示例:

Valid input - 
DECLARE @ClientCode NVARCHAR(9)
SET @ClientCode = N'ABCDEFGHI'
SELECT  @ClientCode

Results
ABCDEFGHI

输入无效——

DECLARE @ClientCode NVARCHAR(9)
SET @ClientCode = 'ABCDDEFGHI'
SELECT @ClientCode

Results
ABCDDEFGH

我希望的设置是 SSMS 会引发错误。我希望避免的是 -

DECLARE @ClientCode NVARCHAR(50)
...

IF LEN(@ClientCode) > 9
RAISERROR('Too long dummy.',16,1)


谢谢你的帮助

【问题讨论】:

  • 我认为您应该将此验证放在客户端而不是在数据库中...不需要为了告诉用户输入太长而往返数据库。更好的是,甚至不要让他们输入太长的字符串。
  • 我同意你的看法。但是,这不是我正在使用的系统中的选项。这些脚本由 SSMS 中的 JR 技术人员运行。所以没有客户端。该脚本用于创建事物的客户端。我的解决方案是让技术人员可以登录的 Web 前端触发所有这些脚本,将参数输入到 Web 表单中,然后单击“开始”。不幸的是,管理层希望保持现状“我们多年来一直这样做,我不明白为什么我们应该花钱以正确的方式去做”......

标签: sql-server error-handling nvarchar


【解决方案1】:

请参阅SQL Server silently truncates varchar's in stored procedures - SQL Server 无法设置为自动引发存储过程中插入的截断错误,因此您必须自己执行检查。您可以在存储过程(您列为“希望避免”的代码)中执行此操作,也可以在客户端应用程序中预先验证。

【讨论】:

  • 谢谢斯科特,这就是我认为的答案。我花了一些时间在这里查看问题,但没有遇到这个问题。 .
【解决方案2】:

我也一直在查看 Scott Chapman 在他的回答中提到的问题,但是,我发现 igorp 的回答中途很有趣,我不得不稍微修改一下以修复 SQL,但它可以工作:

declare @p1 varchar(max), @p2 varchar(max)
select @p1 = 'abcd'
declare @p1Int varchar(2), @p2Int varchar(3)
declare @test table (p1 varchar(2), p2 varchar(3))
insert into @test (p1,p2) values (@p1, @p2)
select @p1Int=p1, @p2Int=p2 from @test

【讨论】:

  • 这是一个有趣的解决方案。然而,它和 DECLARE @ClientCode NVARCHAR(50) ... IF LEN(@ClientCode) > 9 RAISERROR('Too long dummy.',16,1) 一样麻烦
猜你喜欢
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 2010-09-07
  • 2020-11-04
相关资源
最近更新 更多