【问题标题】:How do you pass values for a parameter by position when you need to check multiple values?当您需要检查多个值时,如何按位置传递参数的值?
【发布时间】:2016-05-24 23:20:49
【问题描述】:

我创建了一个带有 2 个可选参数的存储过程 (spBalanceRange)。它们已设置为默认值,当我按位置每个参数仅传递 1 个值时, sp 工作正常。但是,我有一种情况,我试图按位置传递两个字符串,后跟一个通配符。我希望用户能够搜索以“C%”或“F%”开头的供应商名称。以下是 CREATE PROC 语句的要点:

CREATE PROC spBalanceRange 
    @VendorVar varchar(40) = '%',
    @BalanceMin money = 1.0

...

这是我迄今为止尝试过的,但不起作用:

EXEC spBalanceRange '(C%|F%)', 200.00;
EXEC spBalanceRange 'C%|F%', 200.00;

有没有办法在按位置传递时使用通配符检查 2 个或更多字符串值?谢谢。

【问题讨论】:

  • 总是只有第一个字母,你想比较吗?
  • 是的,我只想和第一个字母比较;任何字符都可以跟在“C”或“F”之后,因此是“%”。
  • 在这种情况下,您可以将 IN 子句与 LEFT() 一起使用,正如我在回答中指出的那样。您需要进一步的帮助吗?
  • 我刚刚有了一个非常简单的想法。你可以看看我编辑的答案。

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


【解决方案1】:

编辑:根据您的 cmets,您只查找供应商名称的第一个字母。

在这种特殊情况下,我可以建议一种简单、性能不佳但非常简单的方法。如果字符出现在字符串中,CHARINDEX 返回大于零的数字。因此,您只需将所有查找优先字符作为简单的“链”传递:

DECLARE @DummyVendors TABLE(VendorName VARCHAR(100));
INSERT INTO @DummyVendors VALUES
 ('Camel Industries')
,('Fritz and Fox')
,('some other');

DECLARE @ListOfFirstLetters VARCHAR(100)='CF';

SELECT VendorName
FROM @DummyVendors AS dv
WHERE CHARINDEX(LEFT(dv.VendorName,1),@ListOfFirstLetters)>0

这是以前的答案

检查多个值需要一个专门的比较列表

WHERE val=@prm1 OR val=@prm2 OR ... (you know the count before)

...或者你使用 IN 子句

WHERE LEFT(VenoderName,1) IN ('C','F', ...)

...但是您不能使用 ... IN(@allValues) 之类的参数传递 IN 列表

您可能会考虑创建一个 TYPE 来传递您的所有值(如表格)并使用 INNER JOIN 作为过滤器:https://stackoverflow.com/a/337864/5089204(以及许多其他示例......)

或者你可能会想到动态 SQL:https://stackoverflow.com/a/5192765/5089204

最后但并非最不重要的是,您可能会想到许多拆分字符串方法中的一种。这是我自己的答案之一,“动态 IN 语句”部分:https://stackoverflow.com/a/33658220/5089204

【讨论】:

  • 感谢您提供详细的答案和更多 SQL 的链接。当我设置答案时,我可能应该更详细,但我很着急。 Aaand,我不能发布整个过程,因为 cmets 区域太短了。在这种情况下,我只能在 DECLARE 语句中按位置传递变量(这是为了家庭作业,所以我必须证明我可以用这种方式做到这一点)。我无法在 WHERE 子句中搜索字符,但您提供的内容是有意义的。在我看来,传递变量而不明确分配它们似乎是草率的编码。
【解决方案2】:

我正在回答我自己的问题,也许存在其他解决方案,但这是我的存储过程必须发生的事情,以便按位置传递变量:

CREATE PROC spBalanceRange
@VendorVar varchar(40) = '%',
@BalanceMin money = 1.0
AS
IF (@VendorVar = '%' AND @BalanceMin IS NULL OR @BalanceMin = '')
BEGIN
  PRINT 'BalanceMin cannot be null.';
END
IF (@VendorVar = % AND @BalanceMin IS NOT NULL)
BEGIN
  (sql statement using parameters)
END

EXEC spBalanceRange '[C,F]%', 200.00;

这就是我所知道的。

【讨论】:

    猜你喜欢
    • 2018-08-28
    • 2020-09-05
    • 2012-11-16
    • 2014-04-22
    • 1970-01-01
    • 2016-11-08
    • 2021-04-14
    • 2016-01-21
    • 2018-12-17
    相关资源
    最近更新 更多