当前位置: 首页 > 面试题库 >

如何解析传递给SQL Server中存储过程的VARCHAR?

程毅
2023-03-14
问题内容

我有两个表,tbl_Products并且两个表tbl_Brands都连接在一起BrandId

我有一个存储过程,该过程应该返回所有作为参数传递给它的品牌ID的产品。

我的代码如下。

create proc Sp_ReturnPrdoucts
    @BrandIds varchar(500) = '6,7,8'
AS
BEGIN
    SELECT * 
    FROM tbl_Products as p 
    JOIN tbl_Brands b ON p.ProductBrandId = b.BrandId 
    WHERE b.BrandId IN (@BrandIds)
END

但是,这是给错误的BrandIdINT@BrandIdsVARCHAR

当我按照以下方式进行硬编码时,它可以正常工作,并从db返回所需的数据。

create proc Sp_ReturnPrdoucts
    @BrandIds varchar(500) = '6,7,8'
AS
BEGIN
    SELECT * 
    FROM tbl_Products AS p 
    JOIN tbl_Brands b ON p.ProductBrandId = b.BrandId 
    WHERE b.BrandId IN (6,7,8)
END

任何帮助:)


问题答案:

另一种选择是使用“间接”(正如我一直称呼的那样)

然后,您可以做..

create proc Sp_ReturnPrdoucts
@BrandIds varchar(500) = '6,7,8'
AS
BEGIN
    if (isnumeric(replace(@BrandIds,',',''))=1) 
    begin
        exec('SELECT * FROM tbl_Products as p join tbl_Brands b on p.ProductBrandId=b.BrandId WHERE b.BrandId IN ('+@BrandIds+')')
    end
END

这样,将select语句构建为字符串,然后执行。

我现在添加了验证,以确保传入的字符串是纯数字的(删除所有逗号后)



 类似资料:
  • 本文向大家介绍sqlserver中存储过程的递归调用示例,包括了sqlserver中存储过程的递归调用示例的使用技巧和注意事项,需要的朋友参考一下 递归式指代码片段调用自身的情况;危险之处在于:如果调用了自身一次,那么如何防止他反复地调用自身。也就是说提供递归检验来保证适当的时候可以跳出。 以阶层为例子说存储过程中递归的调用。 递归 当创建此存储过程时候,会遇见一条报告信息

  • 问题内容: 我有一张桌子,我需要在99%的时间内自动分配ID(其他1%似乎使用身份列来排除)。因此,我有一个存储过程来获取以下行中的下一个ID: `` 检查必须检查用户是否手动使用了ID并找到下一个未使用的ID。 当我依次调用它并返回1、2、3时,它可以正常工作。我需要做的是在多个进程同时调用此方法的情况下提供一些锁定。理想情况下,我只需要它专用于围绕此代码锁定last_auto_id表,以便第二

  • 问题内容: 我有一个存储过程,可以根据两个表选择一个数据列表。第一张表是固定的:。但是第二个表可以是多个表之一。表本身的名称是相同的:。但是,表的架构不同: 用户将从应用程序中选择模式,然后将所选模式作为参数传递给存储过程。 但是,当我在创建存储过程时解析存储过程时,会出现错误。 无论如何,有没有要传递架构名称作为参数? 问题答案: 使用DynamicSql 这样尝试

  • com.microsoft.sqlserver.jdbc.sqlserverexception:操作数类型冲突:nvarchar与com.microsoft.sqlserver.jdbc.sqlserverexception.makefromdatabaseerror(sqlserverexception.java:196)com.microsoft.sqlserver.jdbc.sqlserve

  • 问题内容: 我在形成文字时可能做错了。假设我有一个简单的存储过程,如下所示: 的定义为: 执行这样的查询: 产生以下结果集: 代替: 我的文字是否有问题,还是应该以其他方式访问该字段?感谢您的任何建议。 问题答案: 指定输入的方式看起来不错,因为使用行和数组构造器语法可以观察到相同的行为: 和: 产生: 如果添加: 在循环内部,输出为: 表明您实际上正在获取一个元组,其中“ message”是您期