Sql 根据输入有条件地更改变量数据类型

Sql 根据输入有条件地更改变量数据类型,sql,variables,sql-server-2008-r2,type-conversion,Sql,Variables,Sql Server 2008 R2,Type Conversion,我们有一个从应用程序获取调用的存储过程。SP的一个输入是SSN。我们使用的是SQLServer2008R2企业版 SSN数据类型输入为VARCHAR(9)。我们获取该SSN并将其连接到一个表,该表将SSN存储为十进制(9,0)。这会在执行时导致隐式转换,并影响性能 我最初的计划是让输入以VARCHAR的形式输入,然后用DECIMAL数据类型将变量复制到另一个变量上。然而,我们在这个过程中遇到了一个难题。当有新的客户端时,用户还可以输入“新”文本。发生这种情况时,我们得到一个无法将数据类型varc

我们有一个从应用程序获取调用的存储过程。SP的一个输入是SSN。我们使用的是SQLServer2008R2企业版

SSN数据类型输入为
VARCHAR(9)
。我们获取该SSN并将其连接到一个表,该表将SSN存储为
十进制(9,0)
。这会在执行时导致隐式转换,并影响性能

我最初的计划是让输入以
VARCHAR
的形式输入,然后用
DECIMAL
数据类型将变量复制到另一个变量上。然而,我们在这个过程中遇到了一个难题。当有新的客户端时,用户还可以输入“新”文本。发生这种情况时,我们得到一个无法将数据类型varchar转换为decimal的错误消息

有没有办法根据收到的输入有条件地更改变量的数据类型

下面是一个我现在尝试使用的示例,但没有用,因为输入“new”的实例会导致转换错误:

CREATE PROCEDURE [dbo].[StoredProcedureFromApplication](
    @SubscriberSSN VARCHAR(9))
AS
DECLARE @SSN_DEC DECIMAL(9,0)
SET @SSN_DEC = @SubscriberSSN

关于如何更改数据类型,您有什么想法吗?

首先,您应该将SSN存储为字符串而不是数字,因为它们可以以0开头

我认为最好的方法是将结果值设置为
NULL

SET @SSN_DEC = (case when isnumeric(@SubscriberSSN) = 1
                     then cast(@SubscriberSSN as decimal(9, 0))
                end);

我完全同意,不幸的是,正如通常所说的那样,这在我担任DBA之前很久就已经实施了,我必须解决应用程序如何运行的问题。