2012-02-26 53 views
1

我可以在我的存儲過程中使用varchar參數而不聲明其長度嗎?例如,我想聲明我的存儲過程如下:SQL存儲過程參數無長度

CREATE PROCEDURE [TEST] 
    @Domain varchar, 
    @Numbers int 
AS 
..... 

這對我來說容易得多,如果存儲過程可以自動檢測參數的長度,在這種情況下,如果我在我的表我會改列長度不需要去更新所有使用此列的存儲過程。

謝謝

+0

工作得很好,如果你所有的'varchar'參數只有永遠**的一個字符**長..... – 2012-02-26 17:56:07

+0

通過類似的擴展,你想改變'@numbers int'爲'@numbers bigint'因爲如果你將表中的值改爲'bigint'而不是'int'會怎麼樣?你現有的長度值應該是現實的上限值;但考慮一下當您將列更改爲更長時間(外鍵,UI,潛在報告)時您必須更改的其他所有內容,存儲過程是否接近最困難和最慢的查找和更新? – Seph 2012-02-27 07:06:15

+0

謝謝你的回覆,我明白你的觀點。 – 2012-02-27 08:08:13

回答

3

如果省略了長度,它defaults to one character
例如:varcharvarchar(1)的同義詞。定義在一個地方長

一種方法是type,如:

create type Domain from varchar(30) not null; 

然後,您可以使用其他定義這個新類型:

create procedure TestProcedure @par1 domain as select @par1 
go 
create table TestTable (col1 domain) 

但是,你不能改變類型的定義而不放棄使用它的所有東西。

根據我的經驗,數據長度的變化很少,當它們發生時,它們很容易手動重構。所以我會堅持varchar(x)而不是type

1

我只是猜測你在這裏使用的是SQL Server,在這種情況下,你可以指定varchar(max)而不是指定特定的長度。由於the documentation for SQL Server notes,未指定長度被視爲長度1.

其他數據庫不會顯示相同的行爲。例如,PostgreSQL將未指定的長度視爲最大長度。

請注意,varchar(x)或(ANSI標準)character varying(x)在數據庫中幾乎是兼容的。

+0

+1看起來'VARCHAR(MAX)'真的是OP要求的 – Seph 2012-02-27 07:00:23

+0

謝謝...... :) – 2012-02-27 08:10:47