Sql-Server-2005

出現哪些問題,在儲存過程中將所有 varchar 參數的大小聲明為最大值?

  • September 21, 2021

這個問題,似乎其他網站也存在隨著時間的推移增加列大小的問題。

僅增加表中列的大小是一項相當簡單的任務。

但是,當您的商店遵守儲存過程參數的長度必須與相應表列的長度匹配的規則時,您的儲存過程中的大量更改就會下山。

鎖定在 Oracle 表明,程序不需要知道 varchar2 參數的長度。

當您將每個 varchar 參數聲明為 varchar(max) 或 nvarchar(max) 時,有什麼優點和缺點?

顯然,您可以忘記每次增加色譜柱尺寸時都必須調整程序的維護噩夢。

對 SQLRockStar 的回答: 我想保持一個相當保守的表設計,其中具有已知有限長度的欄位根據目前限制進行建模,而不為將來可能的擴展保留。

我的許多表都包含一個 id int、一個程式碼 varchar(30) 和一個描述列 varchar(255)。

程式碼欄位必須反映不同客戶的本地命名約定。

一些客戶需要將此欄位增加到 50。

當我沒有將長度編碼到程序參數中時,我只需要調整這個單一客戶的表格列。

當我堅持將長度編碼到參數中時,我要麼必須為不同的客戶支持不同版本的程序,要麼必須更改並將更改推廣到所有客戶。

例子

-- SQL Server
Create Table dbo.SQLServerTable (
   id int identity(1,1) primary key not null,
   code varchar(30) not null,
   description varchar(255) not null
);
go
Create Procedure WrapInsertSQLServer1 (
   @code varchar(30),
   @description varchar(255)
) as
INSERT INTO SQLServerTable values (@code, @description);
go      

Create Procedure WrapInsertSQLServer2 (
   @code varchar(100),
   @description varchar(1000)
) as
INSERT INTO SQLServerTable values (@code, @description);
go      

注意:當 SQLServerTable 中增加某個字元的長度時,需要調整 WrapInsertSQLServer1,但 WrapInsertSQLServer2 不需要更改。

-- Oracle
Create Table OracleTable (
   id NUMBER(10) primary key not null,
   code varchar2(30) not null,
   description varchar2(255) not null
)
/
CREATE SEQUENCE S_OT START WITH 1
/

Create OR Replace Procedure WrapInsertOracle (
   p_code varchar2,
   p_description varchar2
) as
begin
INSERT INTO OracleTable values (S_OT.NEXTVAL, p_code, p_description);
end;
/   

這裡儲存過程的參數永遠沒有長度。

如果你說 WrapInsertSQLServer2 不行 => 你是說 Oracle 本質上是錯誤的

自從您談論 proc 參數以來:

CREATE PROCEDURE myProc
 @var1 varchar(30),
 @var2 varchar(max)
AS
...

如果參數定義為正確的長度,SQL 將在呼叫過程時拋出錯誤。如果您始終定義為 (max),那麼您必須在 proc 中的任何處理髮生之前手動處理對於目標表列來說太長的傳遞參數。

所以簡而言之,你需要做更多的工作,因為你必須在你以前不需要的過程中添加錯誤處理。

  1. 性能:最大類型是 LOB 類型 = 較慢。顯然如此。
  2. 索引:鍵長度為 900 字節 = 永遠不能有索引或唯一約束
  3. 截斷:插入一個最大值,比如說,一個 20 長度的欄位 = 錯誤
  4. 數據類型優先級:將 20 長度欄位與 Max 變數進行比較 = 隱式轉換 = 不使用索引等

可以說,您應該很少更改長度。是設計錯誤……?

編輯:

  • 第 3 點和第 4 點適用於您對“在 Oracle 中我可以做到這一點……”的具體投訴。
  • 如果您也想匹配列中的 Max 類型,則適用第 1 點和第 2 點

引用自:https://dba.stackexchange.com/questions/1772