【问题标题】:Send multiple variables to a stored procedure to be used in an IN clause?将多个变量发送到要在 IN 子句中使用的存储过程?
【发布时间】:2020-09-08 22:12:18
【问题描述】:

我在网页 gui 上有一些文本框,我需要将它们发送到存储过程。用户可以输入以逗号分隔的姓名、帐号、公司的列表。然后我会做一些解析并将对象列表发送到我的存储过程。我的文本框看起来像这样

Name: [ Peter, Paul, Ryan, Julie ]
Account Numbers: [ 001, 002, 003, 004 ]
Companies: [ New Company, Old Company,  ]

所以我有一个配置文件类,其中包含映射到上面视图模型的名称、帐户等列表。

    我在 gui 上有一些文本框,我需要将它们发送到存储过程。用户可以输入以逗号分隔的姓名、帐号、公司的列表。然后我会做一些解析并将对象列表发送到我的存储过程。我的文本框看起来像这样

    姓名:[Peter, Paul, Ryan, Julie]

    帐号:[001、002、003、004]

    公司:[新公司、旧公司、]

所以我有一个配置文件类,其中包含映射到上面视图模型的名称、帐户等列表。

    列出个人资料 = new List();

    profiles.Names = 名称;

    profiles.AcctNumbers = acctnums;

    profiles.Companies = 公司;

然后我将每个配置文件属性分配给一个 SQL 参数并将其传递给存储过程。

我的存储过程如下所示

ALTER PROCEDURE      [dbo].[GetUsers]

    @Names         varchar(100),

    @AcctNums   varchar(100),

    @Companies varchar(100)

   

    Select * from users

    where Name in @Names

    and AccountNumber in @AcctNums

    and Company in @Companies

理论上你会认为这会起作用,但事实并非如此。存储过程什么都不返回 我怎样才能让我的想法发挥作用?还是我应该彻底改变解决这个问题的方法?

然后我将每个配置文件属性分配给一个 SQL 参数并将其传递给存储过程。

我的存储过程如下所示

ALTER PROCEDURE      [dbo].[GetUsers]

    @Names         varchar(100),

    @AcctNums   varchar(100),

    @Companies varchar(100)

   

    Select * from users

    where Name in @Names

    and AccountNumber in @AcctNums

    and Company in @Companies

理论上你会认为这会起作用,但事实并非如此。存储过程什么都不返回 我怎样才能让我的想法发挥作用?还是我应该彻底改变解决这个问题的方法?

编辑:这与此答案 Not the Same Issue 不同。我需要将多个值传递给驻留在存储过程中的变量。

如果我使用这个建议,我会得到"Procedure or function GetUsers has too many arguments specified."

答案是使用一个简单的选择语句,它与带有变量的存储过程不同

【问题讨论】:

  • @wablab 如果用户输入像彼得、保罗这样的数据,会在自己的行中输入怎么办。然后他们输入属于玛丽的账户号码 100。该行不会有彼得 100 和保罗 100 吗?所以 in 子句不会返回任何数据?我有点困惑
  • 您是否删除了您之前关于我今天早些时候看到的这个确切主题的问题?
  • 真正的关键在于您假设您的用户将按正确的顺序输入分隔数据。这是一个白日梦。 90% 的情况下,用户无法正确输入单个标量值。他们几乎不可能在多个输入中正确获取多条数据。听起来您真正需要的是更好的前端来捕获用户请求。

标签: c# sql-server stored-procedures


【解决方案1】:

像下面这样改变你的存储过程

ALTER PROCEDURE      [dbo].[GetUsers]

    @Names         varchar(100),

    @AcctNums   varchar(100),

    @Companies varchar(100)



    DECLARE @tmpNames TABLE (ID INT) 
    DECLARE  @XML AS XML, @p as int

    SET @XML = CAST(('<X>'+REPLACE(@Names,',' ,'</X><X>')+'</X>') AS XML)

    INSERT INTO @tmpNames SELECT N.value('.', 'Varchar') AS Name FROM @XML.nodes('X') AS T(N)

    Select * from users

    where Name in (select * from @tmpNames)
      and AccountNumber in @AcctNums

    and Company in @Companies
    --or use join
      --Select * from users
      --JOIN @tmpNames ON users.username=@tmpNames.name

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 2010-12-08
    • 1970-01-01
    • 2019-08-10
    • 2012-12-01
    • 2022-01-11
    • 1970-01-01
    • 2015-04-28
    相关资源
    最近更新 更多