Sql 如何定义基于其他列数据类型的存储过程输入数据类型

Sql 如何定义基于其他列数据类型的存储过程输入数据类型,sql,sql-server,stored-procedures,sql-server-2008-r2,Sql,Sql Server,Stored Procedures,Sql Server 2008 R2,我在SQL Server 2008 R2中创建了一个存储过程,以执行如下高级搜索: ALTER PROCEDURE [dbo].[AdvanceSearch] -- Add the parameters for the stored procedure here @SearchType nvarchar(10) = null, @SerialNumber varchar(50) = null, //code goes here 当前,@Seria

我在SQL Server 2008 R2中创建了一个存储过程,以执行如下高级搜索:

ALTER PROCEDURE [dbo].[AdvanceSearch]
        -- Add the parameters for the stored procedure here
        @SearchType nvarchar(10) = null,
        @SerialNumber varchar(50) = null,
//code goes here
当前,
@SerialNumber
变量表示名为
Assets
的表中的一个实列。序列号列的数据类型为
varchar(50)
,它允许空值

因此,我所做的是手动定义相同的数据类型,即
varchar(50)
。但我的问题是,如果将来我更改
资产
表中
序列号
列的数据类型,那么我必须更改存储过程中的类型,会发生什么情况

是否有方法将存储过程中的
@SerialNumber
参数的数据类型定义为与另一个表中的列的数据类型相同?因此,如果列类型更改,存储过程参数将具有新的数据类型


谢谢

您可以基于varchar创建自己的数据类型,并将其用作表和存储过程的数据类型:

CREATE TYPE [dbo].[serialNumber] FROM [varchar](50)

ALTER PROCEDURE [dbo].[AdvanceSearch]
        -- Add the parameters for the stored procedure here
        @SearchType nvarchar(10) = null,
        @SerialNumber [serialNumber] = null,
//code goes here
但由于其他人提到的原因,我不建议这样做(没有
altertype
,您必须删除所有引用的对象,以便通过执行drop/create来更改类型)


简言之:这是不可能的,最好的选择是使用常规的varchar,并使用类似于手动查找和更改所有内容的工具(如果将来需要)。

不,类似的操作在SQL Server中是不可能的。存储过程参数的类型必须在存储过程声明中完全静态地声明-它们不能在运行时根据某些表列的数据类型进行更改@marc_说,在SQL Server中不能这样做。这在Oracle中是可能的,这可能是您以前看到过的。不幸的是,SQL Server中本应与此类似的功能(用户定义的类型-您将声明一个序列号类型,然后列和参数都将是该类型)被严重破坏。您可以,但是,当然,如果不使用它从所有表/过程中删除类型,然后使用新定义重新创建它,就无法更改类型。不幸的是,没有
alter type
命令,因此如果要更改该数据类型,必须先删除所有对象(包括
dbo.AdvanceSearch
存储过程),删除旧类型,创建新类型,然后重新创建所有内容。不幸的是,在我看来,这使得用户定义的类型非常无用……我在尝试时才意识到这一点。感谢您指出。因此,如果我将Assets表中的serialnumber数据类型更改为例如nvarchar(100)而不是varchar(50)。我必须手动修改SP并更改@SerialNumber以匹配新的数据类型?@johnG:不,您实际上必须删除使用该数据类型的所有表/过程才能更改它,这非常糟糕:)