2012-12-14 34 views
5

我已经为我们的生产线创建了一个脚本,用户在执行之前将一些变量输入到脚本中。问题是变量是NVARCHAR(9),并且如果用户输入10个字符,最后一个字符被切断(如预期的那样),我想知道的是如果SQL输入一个值太长?这个问题源于用户粗暴地指责他们的输入。 例子:如何在SQL Server中强制使用nvarchar输入宽度?

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) 


感谢您帮助

+3

我认为你应该把这个验证客户端,而不是在数据库中......不需要为了告诉用户输入过长而往返数据库。更好的是,甚至不要让他们输入太长的字符串。 –

+0

我同意你的意见。但是,这不是我正在处理的系统中的一个选项。 这些脚本由SSMS内的非常JR技术人员运行。所以没有客户端。该脚本用于创建事物的客户端。我的解决方案是让所有这些脚本都被技术人员可以登录的Web前端解雇,将他们的参数输入到Web表单中,然后单击“去”。 不幸的是,管理层希望保持现状:“我们一直这样做多年,我不明白为什么我们应该花这笔钱用正确的方式”...... –

回答

1

请参阅SQL Server silently truncates varchar's in stored procedures - SQL Server不能设置为自动提高存储过程里面的刀片截断误差,所以你必须自己执行检查。您可以在存储过程(您列为“希望避免”的代码)中执行此操作,或者您可以事先在客户端应用程序中进行验证。

+0

谢谢Scott, 这就是我的想法答案是肯定的。我花了一些时间在这里看问题,但没有遇到这个问题。 。 –

0

我也一直在寻找他的回答斯科特·查普曼的引用,但是,我发现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 
+0

这是一个有趣的解决方案。 然而正如繁琐作为 DECLARE @ClientCode NVARCHAR(50) ... IF LEN(@ClientCode)> 9 RAISERROR( '太长虚设。',16,1) –

相关问题