【问题标题】:SQL stored procedure parameter without lengthSQL 存储过程参数不带长度
【发布时间】:2013-10-09 11:41:21
【问题描述】:

我可以在存储过程中使用varchar 参数而不声明其长度吗?例如我想声明我的存储过程如下:

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

如果存储过程可以自动检测参数长度对我来说会容易得多,在这种情况下,如果我更改了表中的列长度,我将不需要去更新所有使用该列的存储过程。

谢谢,

【问题讨论】:

  • 工作得很好,如果你所有的varchar参数只有恰好一个字符长.....
  • 通过类似的扩展,您是否要将@Numbers int 更改为@Numbers bigint,因为如果您将表中的值更改为bigint 而不仅仅是int,该怎么办?您现有的长度值应该是现实的上限;但是考虑一下当您将列更改为更长时必须更改的所有其他内容(外键、UI、可能的报告),存储的过程是否接近于查找和更新最困难和最慢的东西?
  • 谢谢你的回复,我明白你的意思了。

标签: sql stored-procedures


【解决方案1】:

如果省略长度,则为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

【讨论】:

    【解决方案2】:

    我只是猜测您在这里使用的是 SQL Server,在这种情况下您可以指定 varchar(max) 而不是指定特定长度。如the documentation for SQL Server notes,未指定的长度被视为长度1。

    其他数据库没有表现出相同的行为。例如,PostgreSQL 将未指定的长度视为最大长度。

    请注意,varchar(x) 或(ANSI 标准)character varying(x) 在数据库之间几乎是兼容的。

    【讨论】:

    • +1 似乎 VARCHAR(MAX) 确实是 OP 所要求的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多