【问题标题】:Optional parameters in SQL stored procedureSQL 存储过程中的可选参数
【发布时间】:2011-04-07 20:51:29
【问题描述】:

我正在尝试创建一个具有可选参数的存储过程。我按照here 列出的说明进行操作。我还引用了这个SO question。但是我不断收到以下错误:

将数据类型 varchar 转换为 int 时出错。

当我执行它时它可以工作

EXEC sp_get_user {id#}

EXEC sp_get_user NULL, {username}

但失败了

EXEC sp_get_user {username}

存储过程

@id int = NULL,
@username nvarchar(50) = NULL

SELECT
    username = COALESCE(a.Username, b.Username),
    password = COALESCE(a.Password, b.Password),
    signup_date = COALESCE(a.SignedUpOn, b.Signup_Date)
FROM table1 a
FULL OUTER JOIN table 2 b
ON a.ID = b.ID
WHERE ((a.ID = @id OR @id IS NULL)
AND (a.Username = @username OR @username IS NULL)
OR (b.ID = @id OR @id IS NULL)
AND (b.Username = @username OR @username IS NULL))

我尝试添加OPTION(RECOMPILE),但没有成功。我想让这个动态,以便其他开发人员可以调用这个 SP,而不必每次都指定所有参数。如果有什么不同,他们将通过 LINQ 进行连接。

【问题讨论】:

  • 通过 google 找到的旧问题 - 为什么将其标记为 LINQ? “通过 LINQ 连接”是对 LINQ 的唯一引用

标签: linq sql-server-2008 stored-procedures optional-parameters


【解决方案1】:

在这种情况下使用命名参数

EXEC sp_get_user @username = {username}

如果两个参数都是可选的,SQL server 会按位置走,所以你传入的第一个参数会映射到 proc 中的第一个参数

【讨论】:

    【解决方案2】:

    执行存储过程时,您必须分别遵守定义的参数顺序,这就是为什么第一条和第二条语句可以正常工作的原因,在第一个 EXEC sp_get_user {id#} 您传递了 id 并忽略了用户名,然后它需要定义的默认值。此外,在您的第二条语句EXEC sp_get_user NULL, {username} 中,您为 id 指定了 NULL,并且您为 username 参数传递了一个值,这就是它也可以工作的原因。

    另一方面,第三个 EXEC sp_get_user {username} 不起作用,因为 SQL Server 将您的参数 {username} 视为 id 值,这就是它尝试将其转换为整数的原因,当然它会失败。相反,您必须在传递其值时指定参数名称,请参见以下代码:

    EXEC sp_get_user @username = {username}
    

    【讨论】:

      【解决方案3】:

      嗯,是的,显然你的最后一次尝试会失败。

      您的存储过程需要两个参数,按此顺序:

      1. @id INT
      2. @username NVARCHAR(50)

      如果您只是简单地使用单个参数调用存储过程,那么该参数将映射到 @id - 因此它需要是 INT

      如果你想只用一个用户名值调用你的存储过程,你需要使用 named 参数 - 你不能依赖位置(因为第一个也是唯一的参数将始终匹配@id)

      EXEC sp_get_user @username = {username}
      

      【讨论】:

        猜你喜欢
        • 2010-12-21
        • 1970-01-01
        • 1970-01-01
        • 2010-12-15
        • 1970-01-01
        • 2022-10-15
        • 1970-01-01
        • 2010-09-10
        • 1970-01-01
        相关资源
        最近更新 更多