【问题标题】:How to define the stored procedure input data types , to be based on other columns data types如何定义存储过程输入数据类型,以基于其他列数据类型
【发布时间】:2014-09-20 16:10:12
【问题描述】:

我在 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)。但我的问题是,如果将来我更改Assets 表中SerialNumber 列的数据类型,那么我必须更改存储过程中的类型。

有没有办法将存储过程中@SerialNumber 参数的数据类型定义为与另一个表中列的数据类型相同?那么如果列类型发生变化,存储过程参数将具有新的数据类型?

谢谢

【问题讨论】:

  • 不,这样的事情在 SQL Server 中是不可能的。存储过程参数的类型必须在存储过程声明中完整且静态地声明 - 它们不能在运行时根据某个表的列的数据类型进行更改
  • 正如@marc_s 所说,您不能在 SQL Server 中执行此操作。在 Oracle 中是可能的,这可能是您以前见过的地方。
  • 不幸的是,应该使类似于此工作的功能(用户定义的类型 - 您可以声明一个序列号类型,然后列和参数都将是该类型)在 SQL Server 中被严重破坏。

标签: sql sql-server stored-procedures sql-server-2008-r2


【解决方案1】:

您可以基于 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

但由于其他人提到的原因,我不建议这样做(没有ALTER TYPE,您必须删除所有引用的对象才能通过删除/创建更改类型)。

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

【讨论】:

  • 你可以,但当然你不能改变类型,而不必从所有使用它的表/过程中删除类型,然后用新定义重新创建它。
  • 不幸的是,没有ALTER TYPE 命令,所以如果您想更改该数据类型,您必须首先删除所有对象(包括dbo.AdvanceSearch存储过程),删除旧类型,创建新类型,然后重新创建所有内容。不幸的是,这使得用户定义的类型在我看来几乎没有用......
  • 我在试用时才意识到这一点。感谢您指出。
  • 所以如果我将序列号数据类型更改为资产表,例如 nvarchar(100) 而不是 varchar(50)。我必须手动修改 SP 并更改 @SerialNumber 以匹配新数据类型?
  • @johnG:不,您实际上必须删除所有使用该数据类型的表/过程才能更改它,这真的很糟糕:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 2014-08-09
  • 1970-01-01
  • 2012-03-13
  • 2019-03-06
  • 2019-12-06
相关资源
最近更新 更多