【问题标题】:SQL where clause with one parameter to check either int or string field带有一个参数的 SQL where 子句用于检查 int 或 string 字段
【发布时间】:2016-11-08 13:37:13
【问题描述】:

我有这个存储过程:

ALTER PROCEDURE [dbo].[getClassInfo](@ClassId int)
AS
BEGIN
    SELECT [usergroupId]
      ,[gName]
        ,[accessCode]
  FROM [dbo].[usergroup]
  where usergroupid = @ClassId OR accessCode = @ClassId
END

现在,我希望我发送的参数检查 usergroupId 是一个数字还是 accessCode 这是一个字符串。

哪种解决方案可以轻松地使用一个参数检查两种情况?

【问题讨论】:

  • 看看:stackoverflow.com/questions/28893836/… 但在你的情况下转换为 varchar()
  • accessCode 更改为表格中的数字。
  • @ClassId 作为 int 永远不可能保存 accessCode 可能 的所有值,您可能应该使用字符串作为参数,也许可以尝试将其解析为一个 int ......但这似乎你应该只使用两个参数。
  • 你可以这样做OR accessCode = CAST (@ClassId AS VARCHAR(30))
  • 您是否使用了一个奇怪的 SQL Server SKU,您必须为使用的每个参数付费?如果没有,我建议为每个潜在匹配使用单独的命名参数,而不是尝试创建 swiss-army-knife 参数。

标签: sql tsql stored-procedures sql-server-2012


【解决方案1】:

您的参数中不能有任何整数值,因此已更改为 varchar。

Alter Procedure [dbo].[getClassInfo] ( @ClassId Varchar(50) )
As
    Begin
        If IsNumeric(@ClassId + '.0e0') = 1
            Begin
                Declare @ClassIdInt Int = Convert(Int , @ClassId);

                Select  [usergroupId]
                      , [gName]
                      , [accessCode]
                From    [dbo].[usergroup]
                Where   @ClassIdInt = [usergroupid];
            End; 
        If IsNumeric(@ClassId + '.0e0') = 0
            Begin
                Select  [usergroupId]
                      , [gName]
                      , [accessCode]
                From    [dbo].[usergroup]
                Where   [accessCode] = @ClassId;
            End;
    End;

if 语句确定传递的值是否为整数,然后运行相应的查询

【讨论】:

  • ISNUMERIC 检查不保证该值可以转换为int。它回答了没人想问的问题“这个字符串可以转换为任何数字类型吗?”。
  • @Damien_The_Unbeliever 感谢现场,更新了代码以根据这个问题专门测试整数stackoverflow.com/questions/2358147/…
  • 我会在Select 语句上方声明一个变量并将Case 语句放在那里。如果你不必为每条记录评估它是没有意义的。
猜你喜欢
  • 2014-07-15
  • 2021-12-06
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多