2016-05-29 163 views
5

我有一個相對簡單的網站,它使用php + mssql。我有各種存儲過程,可以簡單地插入和刪除工作。我面臨的問題是,我傳入存儲過程的許多參數與插入數據的列的長度相同。sql server存儲過程使用varchar max作爲參數

例如我有一個存儲過程來註冊一個用戶。存儲的過程有一個參數@USERNAMEvarchar(12)作爲類型。 USER表中的列與該長度具有相同的類型。原則上這不是一個真正的問題。但我寧願能夠自由地更改列長度,而不必更改存儲過程參數的長度。

由於mssql php驅動程序不支持它們,我無法使用表值參數。

我可以想象的唯一解決方案就是使用varchar(max)作爲存儲過程參數,但這被認爲是不好的做法?

+1

在我看來,存儲過程參數應該反映底層的列類型。這將避免運行時截斷錯誤並提供一個自我記錄存儲過程接口。 –

+0

恕我直言,不要這樣限制字段長度。磁盤空間很便宜,而且SQL Server速度很快,而且最重要的是......事情變化 –

+1

要麼使用參數sql資源IMO更適合版本控制,要麼爲數據庫中的每個字段創建UDT。那麼你只需要改變那裏的定義來影響表和存儲過程 – Mark

回答

0

簡答:是的。

如果有人傳入長度爲2,147,483,647個字符的用戶名,這將意味着什麼?!通過使用varchar(max),你暗示它可以。

我同意@DanGuzman的評論。表格列的大小應該首先確定,然後參數和變量的大小應相應調整。如果你必須改變表格列的大小,那麼你必須在其他地方傳播這種變化 - 這是最佳實踐方法。

適當調整表格列並不總是那麼容易 - 用戶名應該多長時間? 12對我來說似乎很短,2,147,483,647肯定太長 - 介於兩者之間? ;)@JohnCappelletti也有一個有效的點 - 存儲和處理相對於更改的成本來說便宜,所以在確定大小時偏大。

如果varchar(max)不好,並且你不想遵循最佳實踐,是否有中間立場?也許使用10的因子?一些足夠高於實際大小的東西,但不是過分的。

另一件需要注意的事項,無論您如何調整參數,都是無提示截斷或運行時截斷錯誤 - 明確檢查長度。

相關問題