2012-12-14 30 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) –

相關問題