2012-02-26 137 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